Python 用泊松函数拟合直方图
我试图用泊松函数拟合直方图。我在网站上找到了一些答案,但我无法解决这个问题。 我只想使用Python3.6,使用泊松函数拟合下面直方图条的上界 我正在尝试这个:Python 用泊松函数拟合直方图,python,matplotlib,histogram,curve-fitting,data-fitting,Python,Matplotlib,Histogram,Curve Fitting,Data Fitting,我试图用泊松函数拟合直方图。我在网站上找到了一些答案,但我无法解决这个问题。 我只想使用Python3.6,使用泊松函数拟合下面直方图条的上界 我正在尝试这个: import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit from scipy.special import factorial def poisson(k, lamb): return (lamb**k/fac
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.special 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
值为:
magz = [ 24.638505, 20.446914, 22.10271, 21.227533, 21.761152, 18.923867,
24.054868, 23.92457, 21.515022, 21.835458, 21.204597, 21.848573,
24.036382, 21.126777, 21.599414, 20.044833, 24.390594, 23.772577,
19.608918, 22.676774, 23.6312, 24.12077, 21.22321, 20.350204,
20.548614, 22.650914, 20.561528, 24.892959, 22.49959, 22.94469,
24.346355, 23.934491, 22.448417, 20.535562, 20.785362, 25.131568,
24.462043, 24.173652, 19.105512, 20.641586, 19.5268, 25.0747, 23.254556,
24.460447, 24.37759, 22.708406, 20.765025, 17.27031, 22.723192, 22.4452,
23.366233, 23.238118, 20.72437, 22.278445, 22.231206, 20.98687,
20.341756, 22.968032, 22.504077, 21.277349, 19.163532, 22.44034,
22.406581, 21.999019, 23.313155, 17.945062, 23.027715, 23.640596,
20.60174, 20.124156, 22.39343, 23.786641, 25.201003, 25.227441,
22.537135, 23.779794, 19.416995, 23.550315, 23.225908, 22.579364,
21.69014, 20.50741, 22.543212, 21.640962, 20.425422, 23.793624,
20.554366, 23.522594, 21.03864, 18.282573, 17.33285, 21.015233,
21.611837, 24.00014, 22.741971, 24.416913, 24.053067, 24.314742,
22.400808, 19.622712, 24.911735, 20.04981, 19.128503, 23.83536,
21.864501, 25.037927, 24.449472, 24.200244, 24.492582, 22.378057,
25.411336, 21.727248, 20.16391, 22.045026, 20.017703, 18.534318,
21.995092, 21.434434, 21.825042, 22.78943, 19.006103, 22.398988,
24.198657, 25.018417, 18.829948, 23.94818, 20.813966]
我想要这样的东西:
我认为这里有两个不同的问题 首先,在使用
曲线拟合()
时,您确实需要考虑并给出参数的初始值。由于没有为lamb
提供初始值,因此scipy的曲线拟合
做出了绝对不合理的假设,即该值为1.0。让我澄清一下:curve\u fit()
中的一个严重缺陷是,它允许您不给出起始值,而是默默地为您提供一个值。这个缺陷会让许多用户感到困惑
这里的问题是,lambda=1的起始值在k>10时没有给出强度,这里所有的样本都是。因此,当对lambda的值进行微小更改时,拟合没有看到拟合的改进,因此无法探索值并找到更好的解决方案。您可以通过打印curve\u 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.])
对我来说,这仍然不是很合适,但至少它给出了一些合理的东西。希望能有所帮助。泊松函数本身是用于原始数据还是柱状图仓位值?泊松函数用于柱状图仓位值,但它们是x,y数据,所以有什么区别?我想确定一下您的意思,谢谢。谢谢,非常有用的解释。我试过了,是的,这不是给我一个很好的适合,但它似乎工作。