簡體   English   中英

python - curve_fit似乎無法適應高斯之和

[英]python - curve_fit is seemingly unable to fit sum of gaussians

這里我定義了一個函數來返回任意數量的高斯分布的總和:

import numpy
from numpy import *
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def GaussSum(x,*p):
    n=len(p)/3
    A=p[:n]
    w=p[n:2*n]
    c=p[2*n:3*n]
    return sum([ A[i]*exp(-(x-c[i])**2./(2.*(w[i])**2.))/(2*pi*w[i]**2)**0.5 for i in range(n)])

然后,我繼續為給定的一組參數生成x和y數據,並要求curve_fit使該數據與匹配生成集的初始參數擬合。 我嘗試了很多不同的套裝,包括單高斯和多高斯。

params = [1.,1.,-3.]; #parameters for a single gaussian
#params=[1.,1.,1.,2.,-3.,0.]; #parameters for the sum of two gaussians
xdata=arange(-6,6,0.01)
ydata = array([GaussSum(x,*params) for x in xdata])

popt,pcov = curve_fit(GaussSum,xdata,ydata,p0=params)

print popt
print pcov

每個參數集都給我一個不合適的東西,盡管我已經開始適應解決方案了。 (在上面的單高斯中):

[    52.18242366   5549.66965192  15678.51803797]
inf

我知道函數本身運行正常,因為我已經用它繪制並驗證了它的有效性。

這里的問題是curve_fit期望您正在優化的函數采用輸入向量並返回輸出向量。 如上所述,函數GaussSum采用單個輸入或輸入向量(即numpy.array),但無論哪種方式,它都返回單個標量輸出。 然后,curve_fit函數無法找到良好的最佳擬合。

為了澄清發生了什么,使用numpy(或任何外部庫)始終明確地使用命名空間始終是明智的,如下面的工作版本所示:

import numpy
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def GaussSum(x,*p):
    n=len(p)/3
    A=p[:n]
    w=p[n:2*n]
    c=p[2*n:3*n]
    y = sum([ A[i]*numpy.exp(-(x-c[i])**2./(2.*(w[i])**2.))/(2*numpy.pi*w[i]**2)**0.5 for i in range(n)])
    return y

params = [1.,1.,-3.]; #parameters for a single gaussian                                                                                                                        
#params=[1.,1.,1.,2.,-3.,0.]; #parameters for the sum of two gaussians                                                                                                         
xdata=numpy.arange(-6,6,0.01)
ydata = numpy.array([GaussSum(x,*params) for x in xdata])

popt,pcov = curve_fit(GaussSum,xdata,ydata,p0=params)

具體來說,你隱式調用numpy.sum,它會聚合numpy.array並返回一個值,而你需要使用內置的python總和,它將numpy.array的本機列表聚合為一個numpy.array。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM