我正在尝试用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。我的实现有什么问题? 谢谢
您生成的内容不是 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)
我得到的值低于零且高于 1
提醒一下,PDF 可以高于 1。 (当然,它永远不会是负数)。相反,整个 PDF 曲线下的面积是 1。
快速浏览一下博客,该帖子声称从均匀分布生成双峰正态分布,但最终从 random.normal 中采样,这完全违背了目的。
如果您真的对如何从均匀分布生成任何分布感兴趣,一般方法是使用所需分布的 CDF 的逆。尝试查找逆变换采样。