我是新来的,所以我希望这篇文章清晰易读/正确设置。我在尝试在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值数据适合泊松函数的能力是否存在根本限制?
谢谢您的时间!