我正在尝试使用泊松函数拟合直方图。我正在网站上关注一些答案,但无法解决问题。 我简单地想使用python 3.6使用泊松函数来拟合下面直方图的条形。
我正在尝试:
<body>
<div class="boxes">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</div>
</body>
蓝色拟合线在图表的底部,似乎不起作用。
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
答案 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.])
对我来说,这仍然不合适,但是至少可以提供一些合理的信息。希望有帮助。