我要感谢 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])
绘制这个我们看到:
接下来的步骤将是查看我们是否可以根据为每个查询收集的分类数据确定查询属于哪个分布,但这是另一回事...
谢谢!