2016-12-06 10 views
0

なぜこのフィッティングは非常に悪いですか?カーブフィッティングscipy

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 

def fit(x, a, b, c, d): 
    return a * np.sin(b * x + c) + d 

xdata = np.linspace(0, 360, 1000) 
ydata = 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708) 

popt, pcov = curve_fit(fit, xdata, ydata) 

plt.plot(xdata, 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708)) 
plt.plot(xdata, fit(xdata, popt[0], popt[1], popt[2], popt[3])) 
plt.show() 

近似曲線は、非常に奇妙なようだ、または多分私は、任意の助けに感謝し、それを使用して欠場しています。

これは結果である:

This is the result

答えて

0

curve_fitは、最小二乗問題に対するローカル最小値を見出します。この場合、多くのローカルミニマがあります。

これを回避する方法の1つは、可能な限り初期の推測を良好にすることです。複数のローカルミニマムの問題については、curve_fitのデフォルトのすべての1の初期値はかなり悪い可能性があります。あなたの機能にとって、重要なパラメータはbで、頻度です。代替案として

In [77]: (a, b, c, d), pcov = curve_fit(fit, xdata, ydata, p0=[1, .01, 1, 1]) 

In [78]: a 
Out[78]: 60.953499999999998 

In [79]: b 
Out[79]: 0.017399999999999999 

In [80]: c 
Out[80]: -102.10176491487339 

In [81]: ((c + np.pi) % (2*np.pi)) - np.pi 
Out[81]: -1.570800000000002 

In [82]: d 
Out[82]: 89.953500000000005 
0

、一人で元のデータをプロットし、パラメータの初期推測を作るためにそれを使用する:あなたは値は、0.01の順に、すなわち、小さくても最初の推測として0.01を使用することがわかっている場合。周期関数の場合、周期と振幅を簡単に推定できます。この場合、推測は近すぎる必要はありません。それが返さ

popt, pcov = curve_fit(fit, xdata, ydata, [ 80., np.pi/330, 1., 1. ])

結果は、本質的に元の値です:

それから私は、curve_fitでこれらを使用していました。

array([ 6.09535000e+01, 1.74000000e-02, -1.57080000e+00, 
     8.99535000e+01]) 
関連する問題