如何解决泊松函数与直方图数据的曲线拟合总和
我是新来的,所以我希望这篇文章清晰易读/正确设置。我在尝试在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 举报,一经查实,本站将立刻删除。