scipy.optimize.curve_fit を使用していくつかのヒストグラム データを適合させようとしましたが、これまでのところ、推測パラメーターと大きく異なる適合パラメーターを生成できたことは一度もありません。
当てはめの難解なパラメーターが極小値で動かなくなっても、それほど驚くことはありませんが、線形係数でさえ、最初の推測から移動しません!
以前にこのようなものを見たことがある場合は、アドバイスをいただければ幸いです。最小二乗最小化ルーチンは、特定のクラスの関数では機能しませんか?
私はこれを試して、
import numpy as np
from matplotlib.pyplot import *
from scipy.optimize import curve_fit
def grating_hist(x,frac,xmax,x0):
# model data to be turned into a histogram
dx = x[1]-x[0]
z = np.linspace(0,1,20000,endpoint=True)
grating = np.cos(frac*np.pi*z)
norm_grating = xmax*(grating-grating[-1])/(1-grating[-1])+x0
# produce the histogram
bin_edges = np.append(x,x[-1]+x[1]-x[0])
hist,bin_edges = np.histogram(norm_grating,bins=bin_edges)
return hist
x = np.linspace(0,5,512)
p_data = [0.7,1.1,0.8]
pct = grating_hist(x,*p_data)
p_guess = [1,1,1]
p_fit,pcov = curve_fit(grating_hist,x,pct,p0=p_guess)
plot(x,pct,label='Data')
plot(x,grating_hist(x,*p_fit),label='Fit')
legend()
show()
print 'Data Parameters:', p_data
print 'Guess Parameters:', p_guess
print 'Fit Parameters:', p_fit
print 'Covariance:',pcov
そして、私はこれを見ます:http://i.stack.imgur.com/GwXzJ.png(私はここに新しいので、画像を投稿できません)
Data Parameters: [0.7, 1.1, 0.8]
Guess Parameters: [1, 1, 1]
Fit Parameters: [ 0.97600854 0.99458336 1.00366634]
Covariance: [[ 3.50047574e-06 -5.34574971e-07 2.99306123e-07]
[ -5.34574971e-07 9.78688795e-07 -6.94780671e-07]
[ 2.99306123e-07 -6.94780671e-07 7.17068753e-07]]
なに?これは xmax と x0 の変動の局所的な最小値ではなく、全体的な最小値の最適化からはかけ離れていると確信しています。より適切な推測を行っても、適合パラメーターは変化しません。曲線関数 (2 つの正規分布の合計など) の異なる選択は、同じデータに対して新しいパラメーターを生成するため、データ自体ではないことがわかります。念のため、 scipy.optimize.leastsq 自体でも同じことを試しましたが、サイコロはありませんでした。パラメータはまだ動きません。これについてご意見があれば、ぜひお聞かせください。