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

Posted

技术标签:

【中文标题】如何获得两个重叠正态分布的均值和标准差?【英文标题】:How to get the means and standard deviations of two overlapping normal distributions? 【发布时间】:2021-12-14 17:53:53 【问题描述】:

我有以下情节:

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

我该如何处理?

【问题讨论】:

有趣的问题,它更适合 stats.stackexchange.com,因为它更具概念性。也就是说,传统的方法是将所谓的混合分布拟合到您的数据中。由于数据是循环的,因此问题有点偏僻。我似乎记得将高斯密度明显推广到一个圆圈是所谓的 von Mises 分布。从表面上看,似乎拟合两个 von Mises 凹凸的混合物应该没有什么特别的困难。祝你好运,玩得开心。 谢谢@RobertDodier。这看起来是一个有趣的问题。如果我可以确定数据具有两种均值和标准差,我可以调查其他数据如何可能是这两种分布之间差异的一部分。 【参考方案1】:

我要感谢 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

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])

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

谢谢!

【讨论】:

以上是关于如何获得两个重叠正态分布的均值和标准差?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较

如何绘制一个只有一个变量的平均值和标准差

统计学中样本与z score值

matlab中使用chi2gof函数对正态分布进行拟合后如何获得正态分布的参数μ与σ

正态分布和中心极限定理

Random.nextgaussian() 可以从具有不同均值和标准差的分布中采样值吗?