泊松函数与直方图数据的曲线拟合总和

问题描述

我是新来的,所以我希望这篇文章清晰易读/正确设置。我在尝试在python中使用 curve_fit 将直方图数据拟合为泊松分布之和时遇到困难。数据是一组不同原子数的光子计数。该代码中的集合被截断为0个原子(背景),1个原子或2个原子。无论是使用用户定义的Poisson还是scipy中的poisson.pmf函数,我都无法成功实现拟合而没有错误

```python
from scipy.special import factorial
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np

### User Defined poisson
def poissonian( x,A0,x0,A1,x1,A2,x2 ):
    return (A0 * x0**x * np.exp(-x0) / scipy.special.factorial(x)\
        +A1 * x1**x * np.exp(-x1) / scipy.special.factorial(x)\
        +A2 * x2**x * np.exp(-x2) / scipy.special.factorial(x))

### Built in poisson function
#def poissonian( x,x2 ):
#    return (A0*poisson.pmf(x,x0)+A1*poisson.pmf(x,x1)+A2*poisson.pmf(x,x2))

binwidth = 75
bin2 = 18
xmin = 0
xmax = bin2 * binwidth

counts,bins,bars = plt.hist( counts_77_2x2,bins=bin2,range=(xmin,xmax) )
#counts_77_2x2 is a dataset for the number of photons detected from atoms 
#trapped in an optical tweezer. The point of this fit is to determine the 
#probability of loading n atoms in a given optical tweezer,77 is for tweezer 
#7,2x2 is the Box pixel size for the target tweezer site imaged by emccd


bins = np.rint( bins[1:] - 75 / 2 ).astype( np.int32 )

#for reference
#bins =[  38  112  188  262  338  412  488  562  638  712  788  862  938 
#1012 1088 1162 1238 1312]
#counts= [ 2.  0.  1.  2.  2.  5.  3. 10. 11.  8.  6.  4. 10.  8.  8.  9.  
#7.  3.]


## Initial Guess
p0 = [1,400,9,650,8,1050]

#Bounds for fit
bounds=([1,1,5,525,850],[6,524,14,800,1350])

coeff,var_matrix = curve_fit(poissonian,counts,p0=p0,maxfev=1000000)

print( coeff )```

使用用户定义的泊松函数收益率

.... RuntimeWarning:powerreturn中遇到溢出(A0 * x0 ** x * np.exp(-x0)/ scipy.special.factorial(x)....

我已经阅读了有关类似问题的前几页,我将scipy.special.factorial替换为阶乘,因为它可以容纳更高价值的输入,但无济于事。

使用内置的poisson.pmf概率质量函数产生

... \ anaconda3 \ lib \ site-packages \ scipy \ optimize \ minpack.py:828:OptimizeWarning:无法估计参数的协方差警告.warn('无法估计参数的协方差',

为减少计算开销,我将x值按比例缩小为1(所有仓室均等距,因此以后可以按比例放大以用于实际峰中心)。使用此方法,我终于可以进行工作(尽管很丑陋)

```python
import scipy
from scipy.stats import poisson
from scipy.special import factorial
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np


def poissonian( x,x2 ):
    return (A0 * x0**x * np.exp(-x0) / scipy.special.factorial(x)\
        +A1 * x1**x * np.exp(-x1) / scipy.special.factorial(x)\
        +A2 * x2**x * np.exp(-x2) / scipy.special.factorial(x))

binwidth = 75
bin2 = 18
xmin = 0
xmax = bin2 * binwidth

counts,xmax) )

#for reference
#bins =[  38  112  188  262  338  412  488  562  638  712  788  862  938 1012 
#1088 1162 1238 1312]
#counts= [ 2.  0.  1.  2.  2.  5.  3. 10. 11.  8.  6.  4. 10.  8.  8.  9.  7.  
#3.]


### set bin separation to one to reduce calculation overhead (bins1)

bins1 = np.linspace( 1,18,18 )

## Scaled down guess values
p0 = [1,4,10,15]

#scaled down bounds
bounds=([0.1,0.1,7,13],[5,6,12,3,18])

coeff,bins1,maxfev=1000000)

print( coeff )
```

现在我想知道按比例缩小版本的版本是否正常运行,使用真实数据集的代码是否存在错误,或者python对于非小x值数据适合泊松函数的能力是否存在根本限制?

谢谢您的时间!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)