ここで、任意の数のガウス分布の合計を返す関数を定義しました。
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
関数自体は正常に動作することを知っています。関数を使用してプロットし、その有効性を検証したからです。