绘制具有给定值和权重的 GMD

Drawing a GMD with given values and weights

我想绘制一个高斯混合分布,其中我有我应该需要的所有给定值,但不知何故它们组合成一个分布,我不确定我哪里出错了。

我尝试使用 this question 中提供的解决方案,但他们没有将 GMD 绘制为两个分布的凸组合,而是从一个或另一个分布中随机抽样。这就是我试图解决的问题,但看起来该图只有一个高斯分布;

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import random as rnd

theta = np.array([[3.91973221e-05, 2.59889568e-04], [5.32160367e-06, 4.99763548e-06],[6.65158426e-01, 3.34841574e-01]])

n = 100000
number_of_distributions = 2
mu = theta[0]
sigma = theta[1]
weights = theta[2]
samples = []

for i in range(n):
       population = [rnd.gauss(mu[i], np.sqrt(sigma[i])) for i in range(number_of_distributions)]
       samples.append(rnd.choices(population, weights=weights))
sns.distplot(samples)
plt.show()

基本上我希望它在图中更清楚一点,它是两个独立的高斯分布,并且通过观察情节,没有看过代码的人应该能够区分两者之间的差异有多大两个分布。

我会说你的代码很好。问题是您的分布非常相似并且重叠很多。您可以在 pdf 函数的顶部看到一点不对称,其余部分非常相似,您看不见。

你有两个选择:

选项 1

如果你可以稍微改变你的数据,尝试移动其中一种方法:

这是给mu[0]=0.91973221e-02

选项 2

如果您必须使用该数据集并且无法更改 musigma,您可以使用 kde 函数的带宽参数 bw(并增加数量你的直方图的垃圾箱)。对于某些 bw 值,pdf 函数不是那么平滑,因此您可以看到分布的两个峰值:

sns.distplot(samples, bins=400, kde_kws={"bw": 0.004})
plt.xlim(-0.015, 0.015)

不要忘记调整绘图的 xlim 参数。有时小 bw 值看起来很奇怪:

..只是为了确定

您在生成随机数时使用了 sqrt 的 sigma 参数。如果 sigma 表示您预设中的标准偏差,请直接使用它。