用泊松函数拟合直方图

时间:2018-12-23 11:38:24

标签: python matplotlib histogram curve-fitting data-fitting

我正在尝试使用泊松函数拟合直方图。我正在网站上关注一些答案,但无法解决问题。 我简单地想使用python 3.6使用泊松函数来拟合下面直方图的条形。

我正在尝试:

<body>
<div class="boxes">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
</div>
</body>

结果是: enter image description here

蓝色拟合线在图表的底部,似乎不起作用。

import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit from scipy.misc import factorial def poisson(k, lamb): return (lamb**k/factorial(k))*np.exp(-lamb) fig, ax = plt.subplots() ax.hist(magz,bins=10,alpha=0.3) y,x=np.histogram(magz,bins=10) x = x + (x[1]-x[0])/2 x = np.delete(x,-1) parameters, cov_matrix = curve_fit(poisson, x, y) x_new = np.linspace(x[1], x[-1], 50) ax.plot(x_new, poisson(x_new, *parameters), color='b') 的值是:

magz

我想要这样的东西: enter image description here

1 个答案:

答案 0 :(得分:1)

我相信这里有两个独立的问题。

首先,在使用curve_fit()时,您确实需要考虑并给出参数的初始值。由于您没有给出lamb的初始值,因此scipy的curve_fit绝对不合理地假设该值为1.0。让我清楚一点:curve_fit()中的一个严重缺陷是,它不允许您提供初始值,而为您默默地提供值。该漏洞使许多用户绊倒。

这里的问题是,lambda = 1的起始值在k> 10时没有给出强度,此时所有样本都在该位置。因此,当对lambda的值进行很小的更改时,拟合不会发现拟合的改善,因此无法探索值并找到更好的解决方案。您可以通过打印curve_fit()发送到poisson()函数的值来进行测试。您肯定希望起始值在10左右。它不一定是完美的,但相差太远,以至于模型函数完全没有强度。

第二,您的值实际上并不遵循泊松分布。看来它们可能与泊松分布成正比,但您随后需要包括一个比例因子

简而言之,我想您会想要

def poisson(k, lamb, scale):
    return scale*(lamb**k/factorial(k))*np.exp(-lamb)

,然后使用curve_fit()lamb的适当起始值调用scale

parameters, cov_matrix = curve_fit(poisson, x, y, p0=[10., 10.])

对我来说,这仍然不合适,但是至少可以提供一些合理的信息。希望有帮助。