使用 Numpy 从两个均匀分布创建双峰分布

问题描述 投票:0回答:1

我正在尝试用Python重现这个

博客
bimodalSample功能。

我的尝试:

import numpy as np
    
def bimodal_pdf(distance: float, weight: float) -> np.ndarray:
    r = np.random.rand()

    if r < weight:
        return np.random.normal(r) * (1 - distance)
    else:
        return np.random.normal(r) * (1 - distance) + distance


n_samples = 100000
distance = 0.7
weight = 0.5


pdf = np.array([
    bimodal_pdf(distance=distance, weight=weight) for s in range(n_samples)
])

但是,我得到的值低于零且高于 1。我的实现有什么问题? 谢谢

python numpy
1个回答
0
投票

您生成的内容不是 pdf。您只是从某个分布中抽取了 100000 个样本。 pdf 是样本的“密度函数”(想象它像直方图)。如果很多样本都有一定的相似值,那么那里就会有很高的密度。

如果您想观察密度,可以使用直方图或 kdeplot。

import seaborn as sns

samples = np.array([
    bimodal_pdf(distance=distance, weight=weight) for s in range(10000)
])
sns.kdeplot(samples)

enter image description here


我得到的值低于零且高于 1

提醒一下,PDF 可以高于 1。 (当然,它永远不会是负数)。相反,整个 PDF 曲线下的面积是 1。


快速浏览一下博客,该帖子声称从均匀分布生成双峰正态分布,但最终从 random.normal 中采样,这完全违背了目的。

如果您真的对如何从均匀分布生成任何分布感兴趣,一般方法是使用所需分布的 CDF 的逆。尝试查找逆变换采样。

© www.soinside.com 2019 - 2024. All rights reserved.