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

scipy curve_fit 中的边界

如何解决scipy curve_fit 中的边界

我正在尝试拟合二分量高斯拟合:

mu0 = sum(velo_peak * spec_peak) / sum(spec_peak)
    sigma = np.sqrt(sum(spec_peak * (velo_peak - mu0)**2) / sum(spec_peak))
    
    def Gauss(velo_peak,a,mu0,sigma):
         res = a * np.exp(-(velo_peak - mu0)**2 / (2 * sigma**2))
         return res
    
    p0 = [max(spec_peak) - RMS,sigma]   # a = max(spec_peak)
    popt,pcov = curve_fit(Gauss,velo_peak,spec_peak,p0,maxfev=10000,bounds=((0,+np.inf,+np.inf),(0,+np.inf)))
    
    
    #____________________two component gaussian fit_______________________#
    
    def double_gaussian(velo_peak,a1,mu1,sigma1,a2,mu2,sigma2):
      
        res_two = a1 * np.exp(-(velo_peak - mu1)**2/(2 * sigma1**2))  \
                  + a2 * np.exp(-(velo_peak - mu2)**2/(2 * sigma2**2))
        return res_two
    
    ##_____________________Initial guess values__________________________##
    sigma1 = 0.7 * sigma
    sigma2 = 0.7 * sigma
    mu1 = mu0 + sigma  
    mu2 = mu0 - sigma
    a1 = 3        
    a2 = 1               
    guess = [a1,sigma2]
    popt_2,pcov_2 = curve_fit(double_gaussian,guess,+np.inf)))

但是我得到了一个我想避免的负面部分,但我不知道如何正确实现边界,因为我不太了解文档。

enter image description here

我收到以下错误ValueError: Inconsistent shapes between bounds and `x0`.

谁能指导我如何正确使用边界?

解决方法

它期待 "2-tuple of array_like,optional" 所以它看起来像:

((lower_bound0,lower_bound1,...,lower_boundn),(upper_bound0,upper_bound1,upper_boundn))

在我看来,如果您想避免负值,那么在双高斯中您需要将 a1a2 限制为正值。

关注您的guess

[a1,mu1,sigma1,a2,mu2,sigma2]

那就是:

... bounds=[(0,-np.inf,-np.inf),(np.inf,np.inf,np.inf)],...

演示:

import matplotlib.pyplot as plt

def double_gaussian(velo_peak,a1,sigma2):

    res_two = a1 * np.exp(-(velo_peak - mu1)**2/(2 * sigma1**2))  \
              + a2 * np.exp(-(velo_peak - mu2)**2/(2 * sigma2**2))
    return res_two
x = np.linspace(0,10,1000)
y = double_gaussian(x,1,3,7,0.5) + 0.4*(np.random.random(x.shape) - 0.5)
popt,_ = curve_fit(double_gaussian,x,y,bounds=[(0,np.inf)])
plt.plot(x,y)
plt.plot(x,double_gaussian(x,*popt))

enter image description here

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