2016-04-26 12 views
2

私はいくつかの同様の質問があることを知っていますが、それらのどれも私をさらに持ち込まなかったので、私は自分のものを尋ねることにしました。 私の問題への回答がすでにどこかにある場合は申し訳ありませんが、本当に見つけられませんでした。scipy.optimzeからのcurve_fitの問題

私はcurve_fitを使用して、むしろ線形データにf(x)= a * x ** bを当てはめてみました。それは、正しくコンパイルが、下に示すような結果が道オフです:

enter image description here

事は、私は本当に私がやっているかわからないが、常にフィット一方では、より多くのであること、です科学よりも芸術であり、少なくとも1つの一般bug with scipy.optimizeがあった。

は私のデータは次のようになります。

x値:

[16.8, 2.97, 0.157, 0.0394, 14.000000000000002, 8.03, 0.378, 0.192, 0.0428, 0.029799999999999997, 0.000781, 0.0007890000000000001] 

y値を:最後の回答で本当にいいの例を使用して私のコード(だ

[14561.766666666666, 7154.7950000000001, 661.53750000000002, 104.51446666666668, 40307.949999999997, 15993.933333333332, 1798.1166666666666, 1015.0476666666667, 194.93800000000002, 136.82833333333332, 9.9531566666666684, 12.073133333333333] 

that question):

def func(x,p0,p1): # HERE WE DEFINE A FUNCTION THAT WE THINK WILL FOLLOW THE DATA DISTRIBUTION 
    return p0*(x**p1) 

# Here you give the initial parameters for p0 which Python then iterates over to find the best fit 
popt, pcov = curve_fit(func,xvalues,yvalues, p0=(1.0,1.0))#p0=(3107,0.944)) #THESE PARAMETERS ARE USER DEFINED 

print(popt) # This contains your two best fit parameters 

# Performing sum of squares 
p0 = popt[0] 
p1 = popt[1] 
residuals = yvalues - func(xvalues,p0,p1) 
fres = sum(residuals**2) 

print 'chi-square' 
print(fres) #THIS IS YOUR CHI-SQUARE VALUE! 

xaxis = np.linspace(5e-4,20) # we can plot with xdata, but fit will not look good 
curve_y = func(xaxis,p0,p1) 

開始値はgnuplotとの適合からですが、それはもっともらしいですが、私はクロスチェックする必要があります。

これは、印刷出力(最初のP0、P1、その後、カイ二乗を装備)です、私はこれは難しい質問だと思い事前のため、多くのおかげで

[ 4.67885857e+03 6.24149549e-01] 
chi-square 
424707043.407 

フィッティング curve_fitは和最適化

答えて

1

からcurve_fitは点のそのすべてを負い^ 2

(あなたがここでやっているよう)あなたがエラーを渡さない場合(データモデル)^ 2 /(エラー)

この場合、データが多くの桁にわたっているため、最も大きなy値を持つポイントが目的関数を支配し、curve_fitが他のものを犠牲にしてそれらのフィッティングを試みます。

これを修正する最も良い方法は、あなたのyvaluesの誤差をフィットに含めることです(あなたが作成したプロットにエラーバーがあるように見えます)。これは、sigmaパラメーターがcurve_fitの場合に渡して行うことができます。

+0

「シグマ」を使用していただきありがとうございました。私はそれがa)重要ではないと思っていたので、以前はそれを使用していませんでした。そして、b)xvaluesのエラーです。 (なぜ私は 'xvalues'にエラーのパラメータがないのですか?) また、推定誤差1は設計上の欠陥で、' 0.1 * value'のようなものが好きです。同意しますか?あなたはバグ報告を提出する価値があると思いますか?ご挨拶 – Fabi

+0

実際には、コード内で私にとって最も驚きのないパスは、エラーが与えられなければエラーが一定であると仮定すべきです。それは通常、あなたが望むものでしょう。 [ドキュメントもここではっきりしています](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.curve_fit.html) –

+0

わかりません。先験的には違いはないので、ポイントがどれほど重要であるかに影響を与えない方法でなければならないと私は常に考えていました。あなたは知っていますか? – Fabi

1

私は実験の部分を再考するだろう。二つのデータポイントは疑問です: enter image description here

ログましたので、あなたが私たちを示した画像は、なかなか良さそうです:

enter image description here

あなたはログ(X)の線形近似を行うと、ログインでき(y)を。このようにして、最大残差の影響を制限することができます。もう一つのアプローチは、頑強な回帰(スクリーニングからのRANSACまたはスクリーからの最小スクエア)です。

ただし、データポイントをさらに収集するか、測定を繰り返す必要があります。

+0

他のデータは本当にオプションではありませんが、私のポイントはすべて単一のメッセージであるため、ポイントを無視することはできません。 しかし、計算上のあなたのアイデアは非常に有用であり、私はそれらを覚えておきます。ありがとうございました。 – Fabi

関連する問題