statistics - 如何获得两个重叠正态分布的均值和标准差?
解决方案
我要感谢 Robert Dodier 和 Adrian Keister 的开始以及 Emily Grace Ripka 提供的 GitHub 项目:Peakfitting 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])
绘制这个我们看到: 接下来的步骤将是看看我们是否可以根据为每个查询收集的分类数据确定查询属于哪个分布,但这是另一回事......
谢谢!
推荐阅读
- android - 我无法访问我的 Firebase Crashlytics 仪表板
- javascript - React 原生 Expo Intent 打开应用传递参数
- c - c 函数不适用于所有尝试发送的文件
- laravel-5 - Laravel 中的远关系
- python - 有没有办法在 VSCode 的新窗口中打开图表?
- powershell - 在 PowerShell 中加入数组,类似于连接 DataFrame 列
- .net - 如何让 RequestCachePolicy 尊重 max-age
- sparql - 在 SPARQL 查询中返回同一列下的值
- python - 索引超出范围的python
- image-processing - PNG 输出 alpha 通道但没有 RGB 和 JPG 输出 RGB 但没有 alpha