Python上的故障泊松拟合函数

问题描述 投票:0回答:1

我在将泊松分布拟合到我的数据集时遇到麻烦。我已经使用此过程来拟合所有其他数据集,结果都很好,但是由于某些原因,其中有一组特别无法使用。我的代码是这样的:

E3_comb1=n.array([835., 822., 880., 876., 855., 866., 827., 903., 881., 850., 885.,
       811., 873., 887., 921., 948., 808., 938., 881., 845.])

plt.hist(E3_comb1, bins=140, edgecolor='black')
plt.xlabel('Number of counts per bin')
plt.ylabel('Number of repetition')
plt.title('Amount of repetition of each number of counts per bin for Experiment 3, combined vertically')

哪个输出this图;这是我所期望的。现在,要计算我的泊松拟合,我有:

entries, bin_edges, patches = plt.hist(E3_comb1, bins=140, range=[0, 950])
bin_middles = 0.5*(bin_edges[1:] + bin_edges[:-1])
parameters, cov_matrix = curve_fit(poisson, bin_middles, entries)

我的泊松函数定义为:

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

现在,我的输入值,垃圾箱边缘和垃圾箱中间值恰好是我期望的值。但是由于某种原因,它输出的参数值为0.19。也就是说,平均值为0.19,那时我希望它在880左右。的确,如果我绘制泊松拟合,则使用:

plt.hist(E3_comb1, bins=140, edgecolor='black')
plt.plot(x, poisson(x, *parameters), '--r', label='poissonian fit')
plt.xlabel('Number of counts per bin')
plt.ylabel('Number of repetition')
plt.title('Amount of repetition of each number of counts per bin for Experiment 3, combined vertically')
plt.legend()

它输出this,这不是我想要的,并且清楚地表明出了点问题。我试图检索错误,但似乎无法这样做。希望您能告诉我如何解决此问题。

由于我还是这方面的初学者,所以我也希望你尽可能清楚。

非常感谢大家。

python statistics poisson
1个回答
0
投票

[您似乎希望您的Poisson分布的中心在880附近。但是,curve_fit函数将搜索默认值约为1的参数。这可以通过在[[ C0],其中p0=guesscurve_fit函数的所有期望值的元组。就您而言,只是guess

使用泊松函数和一些虚拟数组,我们可以通过调整poisson参数来看到期望的形状:

lamb

A lamb导致的分布在y方向仅高1e-16。将x = n.arange(100) plt.plot(x, poisson(x, 50)) plt.show() 增加到880附近会导致y的高度小于1e-40,因此显然这是行不通的。我建议您使用lamb = 50的不同值,绘制结果分布,找到一个接近您期望值的分布,并使用lamb作为曲线拟合的猜测。然后,您的配件将如下所示:

lamb

由于lamb大时从guess = (880) parameters, cov_matrix = curve_fit(poisson, bin_middles, entries, p0=guess) 函数获得的极小值,您可能需要调整poisson函数以添加y或x缩放或偏移。

让我知道这是否对您有帮助,在您探索之后,我可以再进行研究。

© www.soinside.com 2019 - 2024. All rights reserved.