微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy.optimize.curve_fit 双高斯拟合失败

如何解决scipy.optimize.curve_fit 双高斯拟合失败

我正在尝试对双高斯分布进行相当直接的拟合,但我从 scipy_curvefit 得到的结果并不令人满意。 我使用的代码如下所示。

counts= np.asarray([ 1.,1.,8.,6.,5.,4.,10.,25.,73.,89.,122.,119.,105.,107.,69.,74.,49.,60.,30.,37.,40.,42.,43.,34.,41.,22.,11.,7.,0.,3.,2.,0.])
bins=np.asarray([0.05112413,0.05349386,0.0558636,0.05823333,0.06060306,0.0629728,0.06534253,0.06771226,0.07008199,0.07245173,0.07482146,0.07719119,0.07956093,0.08193066,0.08430039,0.08667013,0.08903986,0.09140959,0.09377933,0.09614906,0.09851879,0.10088853,0.10325826,0.10562799,0.10799773,0.11036746,0.11273719,0.11510692,0.11747666,0.11984639,0.12221612,0.12458586,0.12695559,0.12932532,0.13169506,0.13406479,0.13643452,0.13880426,0.14117399,0.14354372,0.14591346,0.14828319,0.15065292,0.15302266,0.15539239,0.15776212,0.16013185,0.16250159,0.16487132,0.16724105])

from scipy.optimize import curve_fit
from scipy.stats import chisquare
import numpy as np
import matplotlib.pyplot as plt

def gauss(x,mu,sigma,A):
    return A*np.exp(-(x-mu)**2/2/sigma**2)

def bimodal(x,mu1,sigma1,A1,mu2,sigma2,A2):
    return gauss(x,A1)+gauss(x,A2)

plt.figure(figsize=(10,7))
expected=[0.08,0.001,120,0.11,70]

p,cov=curve_fit(bimodal,bins[6:32],counts[6:32],p0=expected)

fit_chi=chisquare(bimodal(bins[6:32],*p),f_exp=counts[6:32] )
p_man=[ 7.9441e-02 +0.002,6.127e-03 +0.0006,118,1.0068e-01+0.005,1.222e-02-0.004,4.373e+01]
man_chi=chisquare(bimodal(bins[6:32],*p_man),f_exp=counts[6:32] )

x=np.arange(0.,0.4,0.001)
plt.bar(bins,counts,bins[1]-bins[0])
plt.plot(x,bimodal(x,'-',color='r',label='model %.2f'%fit_chi[0])
plt.plot(x,color='orange',label='model manual: %.2f'%man_chi[0])
plt.ylim(1,140)
plt.yscale('log')
plt.legend()
plt.xlim(0,0.4) 
plt.savefig('DoubleGauss.png')

我知道我的分布不完全是两个高斯分布,但非常接近。 这是拟合的结果,也是我手动调整双峰函数参数时的结果。

Plot with both fits

您可以看到,当我手动调整参数时,不仅我的手动数字在视觉上看起来更好,而且卡方(在标签中)也更好。 我还尝试通过使用拟合参数作为下一次迭代的起始值来迭代改进拟合,但我没有得到任何改进。 这对我来说似乎很奇怪。有没有人知道我可能做错了什么,或者我使用的方法不适合这项任务?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。