昨日の多項式フィッティングのコードは流石に汚すぎたので,ライブラリを使うことにする.
numpy に numpy.polyfit というそのものズバリな機能があるようだ.
ドキュメントによると v1.4 以降は非推奨らしいが,簡単なので,これを使って再度図を作成してみる.
%matplotlib inline import matplotlib.pyplot as plt import numpy as np np.random.seed(42)
# t = sin(2 \pi x) x1 = np.linspace(0, 1, 100) t1 = np.sin(2 * np.pi * x1) # t = sin(2 \pi x) + gaussian noise x2 = np.linspace(0, 1, 10) t2 = np.sin(2 * np.pi * x2) + np.random.normal(0, 0.2, 10)
# figure 1.4 # fitting with polynomial functions w0 = np.polyfit(x2, t2, 0) w1 = np.polyfit(x2, t2, 1) w3 = np.polyfit(x2, t2, 3) w9 = np.polyfit(x2, t2, 9) # visualize fig, axs = plt.subplots(2, 2, figsize=(12, 8)) axs[0, 0].set_title('M = 0') axs[0, 1].set_title('M = 1') axs[1, 0].set_title('M = 3') axs[1, 1].set_title('M = 9') for ax in axs.flat: ax.plot(x1, t1, color='green') ax.scatter(x2, t2, facecolor='None', edgecolor='blue') ax.set(xlabel='x', ylabel='t') axs[0, 0].plot(x1, np.poly1d(w0)(x1), color='red') axs[0, 1].plot(x1, np.poly1d(w1)(x1), color='red') axs[1, 0].plot(x1, np.poly1d(w3)(x1), color='red') axs[1, 1].plot(x1, np.poly1d(w9)(x1), color='red') plt.tight_layout()
それっぽく再現できた. たったの10サンプルなら正規方程式を使って解析的に解いた方が早いかもしれないが,そろそろ次に進みたいのでこれは一旦これで良しとする.