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

时间:2020-10-20 14:43:57

标签: python histogram curve-fitting poisson probability-distribution

我是新来的,所以我希望这篇文章清晰易读/正确设置。我在尝试在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, A0, x0, A1, x1, A2, 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, 5,850], [6,524, 14,800, 14,1350])

coeff, var_matrix = curve_fit(poissonian, bins, 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, 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))

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

counts, bins, bars = plt.hist( counts_77_2x2, bins=bin2, range=(xmin, 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, 8,10, 8,15]

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

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

print( coeff )
```

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

谢谢您的时间!

0 个答案:

没有答案