2017-12-26 81 views
1

私は次のコードを使用して、いくつかのデータに合うようにしようとしています動作しません:私はないです何のscipyのダウンロードcurve_fitはよく

enter image description here

任意の考え:このプロットを作る

import numpy as np 
import scipy.optimize 
import matplotlib.pyplot as plt 

def fseries(x, a0, a1, b1, w): 
    f = a0 + (a1 * np.cos(w * x)) + (b1 * np.sin(w * x)) 
    return f 

x = np.arange(0, 10) 
y = [-45.0, -17.0, -33.0, 50.0, 48.0, -3.0, -1.0, 2.0, 84.0, 71.0] 

res = scipy.optimize.curve_fit(fseries, x, y, maxfev=10000) 

xt = np.linspace(0, 10, 100) 
yt = fseries(xt, res[0][0], res[0][1], res[0][2], res[0][3]) 

plt.plot(x,y) 
plt.plot(xt, yt, 'r') 
plt.show() 

理解や間違っている?

+0

それぞれのシリーズのサンプル数がn = 100と比較してn = 10であるため、n = 100のときに空白が多く残っています。 – DrBwts

答えて

1

まず、カーブフィッティングは、任意のデータセットに対して良好な曲線を作成する魔法のデバイスではありません。指数曲線を対数データセットにうまく収めることはできません。あなたのデータを見ると、あなたが定義した関数によってうまく記述されているように見えますか?線形関数と正弦関数のオーバーレイのように見えますか?
次に、カーブフィッティングは反復プロセスであり、開始値に大きく依存します。 scipy manualから:

P0:なし、スカラー、またはN長配列、パラメータ用のオプション 初期推定。なしの場合、初期値はすべて1

p0の方が良いでしょうか?
最後に、2つの配列を返します。あなたはただ一つだけ必要な場合でも、私は両方を読むでしょう。コードを単純化します。

p0 = (10, 20, 20, 1.5) 
res, _popcv = scipy.optimize.curve_fit(fseries, x, y, p0, maxfev=10000) 
xt = np.linspace(0, 10, 100) 
yt = fseries(xt, *res) 

試してみて、あなたはすでに、より良いフィット感を得ます。 enter image description here
あなたは、さらにフィット感を向上させることができますが、この機能は便利であるかどうか

def fseries(x, a0, a1, b1, w): 
    f = a0 * x + (a1 * np.cos(w * x)) + (b1 * np.sin(w * x)) 
    return f 

enter image description here

とのより良いフィット関数を定義するとき、あなたは決定する必要があります。それがデータセットに適しているという理由だけで、それがあなたの状況に適した記述子であるとは限りません。

+0

恐ろしいです!ありがとうございました – KDB

+0

合理的な初期推測をどのようにして決定できますか? p0値はy値に関係していないようです。 – KDB

+1

'p0'は、定義された関数' fseries'の変数の初期推定値です。この場合、 'a0、a1、b1、w'が含まれています。これは' res'のフィットアルゴリズムから戻ってくるのと同じリストです。 – MrT

関連する問題