すだちキャンパス

すだちキャンパス

やってみたこと、学んだことなどのメモ。

Pythonで画像処理〜フィッティング〜

こんにちは。Python画像処理シリーズ(?)です。
今回は、簡単なカーブフィッティングを行ったのでそれについて書きます。
前回の記事はこちら↓
kabos.hatenablog.jp

[:contents]

準備

まずはデータを読み込みます。

exp_data = np.load('data.npy')
x = exp_data[:, 0]
y = exp_data[:, 1]

次に、必要な行列を作成します。

mat_linear = x
mat_const = np.ones(len(x))
f = 1.0
mat_sine = np.sin(f*x)

# np.vstack で行列を結合
A = np.vstack((mat_const, mat_linear, mat_sine))
A = A.T

最小二乗法でフィッティング

色々頑張ると最小二乗法の式から求める係数がわかるらしく、それがこちらです。
また、numpyの関数を用いても同じ係数が求まります。

#最小二乗法
coeff = np.dot(np.dot(np.linalg.inv(np.dot(A.T, A)), A.T), measurements)

#numpyの関数
coeff = np.linalg.lstsq(A, measurements)[0]

あとは求まった係数を用いてフィッティングします。

x_fit = np.linspace(min(x), max(x), x.shape[0])
y_fit = coeff[0] + coeff[1]*x_fit + coeff[2]*np.sin(f*x_fit)

plt.figure(1)
plot1 = plt.scatter(x, measurements, label='Measurements')
plt.title('Measurememts & Least Squares fit')
plot2 = plt.plot(x_fit, y_fit, label='Least Squares fit')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')

結果

f:id:sweetgohan:20191203073738p:plain