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')
結果