我正在尝试在泊松分布的直方图上拟合一条曲线,如下所示
我修改了fit函数,使其类似于泊松分布,参数t作为变量。但curve_fit函数无法绘制,我不知道为什么。
def histo(bsize):
N = bsize
#binwidth
bw = (dt.max()-dt.min())/(N-1.)
bin1 = dt.min()+ bw*np.arange(N)
#define the array to hold the occurrence count
bincount= np.array([])
for bin in bin1:
count = np.where((dt>=bin)&(dt<bin+bw))[0].size
bincount = np.append(bincount,count)
#bin center
binc = bin1+0.5*bw
plt.figure()
plt.plot(binc,bincount,drawstyle= 'steps-mid')
plt.xlabel("Interval[ticks]")
plt.ylabel("Frequency")
histo(30)
plt.xlim(0,.5e8)
plt.ylim(0,25000)
import numpy as np
from scipy.optimize import curve_fit
delta_t = 1.42e7
def func(x, t):
return t * np.exp(- delta_t/t)
popt, pcov = curve_fit(func, np.arange(0,.5e8),histo(30))
plt.plot(popt)
2条答案
按热度按时间cl25kdpy1#
你的代码的问题在于你不知道
curve_fit
的返回值是什么,它是拟合函数的参数和它们的协方差矩阵,而不是你可以直接绘制的东西。分组最小二乘拟合
一般来说,你可以得到一切非常,非常容易:
这就是结果:
未分组最大似然拟合
更好的可能性是根本不使用直方图,而是执行最大似然拟合。
但是通过更仔细的研究,甚至这也是不必要的,因为泊松分布参数的最大似然估计量是算术平均值。
但是,如果您有其他更复杂的PDF,您可以使用以下示例:
lfapxunr2#
感谢您发送编修。
您可能需要考虑以下事项:
1)为了获得更好的数值行为,计算“对数泊松”,而不是计算“泊松
2)不要使用“lamb”,而是使用对数(我称之为“log_mu”),以避免拟合“徘徊”到“mu”的负值。
其中“loggamma”是
scipy.special.loggamma
函数。实际上,在上面的拟合中,“loggamma”项仅向被最小化的函数添加了一个常量偏移,因此,只需执行以下操作即可:
注意:
log_poisson_()
与log_poisson()
不同,但当以上述方式用于最小化时,将给予相同的拟合最小值(相同的mu值,直到数值问题)。被最小化的函数的值将被偏移,但通常不关心这一点。