如何获得两个重叠正态分布的均值和标准差?

How to get the means and standard deviations of two overlapping normal distributions?

我有以下情节:

我想估计明显重叠的正态分布的均值和标准差。这有点复杂,因为数据是基于一天中的小时,它也是循环的——尾巴的右端泄漏到左端。

我该如何处理?

感谢 Robert Dodier 和 Adrian Keister 的启动以及 Emily Grace Ripka 提供的 GitHub 项目:Peak fitting Jupyter notebook

我能够用 von Mises 分布来近似这两个不同的重叠分布,然后通过选择均值和 kappa(相当于 von Mises 分布的标准差)来优化预测以最小化误差。

我能够使用 SciPy Python 模块 类 完成此操作:scipy.stats.vonmises 和 scipy.optimize.curve_fit

我创建了以下两个辅助函数:

def two_von_mises(x, amp1, cen1, kappa1, amp2, cen2, kappa2):
    return (amp1 * vonmises.pdf(x-cen1, kappa1)) + \
           (amp2 * vonmises.pdf(x-cen2, kappa2))

def one_von_mises(x, amp, cen, kappa):
    return amp * vonmises.pdf(x-cen, kappa)

我需要将一天中的时间转换为 -pi <= {time of day} < pi 的间隔范围,如下所示:

hourly_df['Angle'] = ((two_pi * hourly_df['HourOfDay']) / 24) - np.pi

然后我可以像这样使用 scipy.optimize 模块的 curve_fit 函数:

popt, pcov = curve_fit(two_von_mises, hourly_df['Angle'], hourly_df['Count'], p0 = [1, 11, 1, 1, 18, 1])

由此我得到了两个分布的所有参数估计值(来自上面的 popt 变量):

array([1.66877995e+04, 2.03310292e+01, 2.03941267e+00, 3.61717300e+04,
       2.46426705e+01, 1.32666704e+00])

绘制这个我们看到: 接下来的步骤是看看我们是否可以根据为每个查询收集的分类数据来确定查询属于哪个分布,但这是另一回事了...

谢谢!