web-dev-qa-db-ja.com

python numpy / scipyカーブフィッティング

私はいくつかのポイントを持っていますが、このポイントにカーブを当てようとしています。 scipy.optimize.curve_fit関数が存在することは知っていますが、ドキュメント、つまりこの関数の使用方法がわかりません。

私のポイント:np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

誰もそれを行う方法を説明できますか?

49
Bob

単純な多項式近似から始めることをお勧めします。scipy.optimize.curve_fitは関数fを近似しようとしますが、これは点の集合に合わせて知る必要があります。

これは、numpy.polyfitpoly1dを使用した単純な3次多項式近似であり、最初は最小二乗多項式近似を実行し、2番目は新しい点を計算します。

import numpy as np
import matplotlib.pyplot as plt

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
# get x and y vectors
x = points[:,0]
y = points[:,1]

# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)

# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)

plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()

enter image description here

85
jabaldonedo

最初に、numpy配列をx値とy値を含む2つの別個の配列に分ける必要があります。

x = [1, 2, 3, 9]
y = [1, 4, 1, 3]

curve_fitには、希望するフィットのタイプを提供する関数も必要です。たとえば、線形フィットは次のような関数を使用します

def func(x, a, b):
    return a*x + b

scipy.optimize.curve_fit(func, x, y)は、2つの配列を含むnumpy配列を返します。最初の配列には、データに最適なaおよびbの値が含まれ、2番目の配列には最適な適合パラメーターの共分散が含まれます。

これは、指定したデータを使用した線形近似の例です。

import numpy as np
from scipy.optimize import curve_fit

x = np.array([1, 2, 3, 9])
y = np.array([1, 4, 1, 3])

def fit_func(x, a, b):
    return a*x + b

params = curve_fit(fit_func, x, y)

[a, b] = params[0]

このコードはa = 0.135483870968およびb = 1.74193548387を返します

これは、ポイントと線形フィットを含むプロットです...これは明らかに悪いものですが、フィット関数を変更して、希望するタイプのフィットを取得できます。

enter image description here

46
Greg