1

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 自体でも同じことを試しましたが、サイコロはありませんでした。パラメータはまだ動きません。これについてご意見があれば、ぜひお聞かせください。

4

2 に答える 2