一日坊主

雰囲気でやっている

PRML上巻 P6

昨日の多項式フィッティングのコードは流石に汚すぎたので,ライブラリを使うことにする.

numpy に numpy.polyfit というそのものズバリな機能があるようだ.

ドキュメントによると v1.4 以降は非推奨らしいが,簡単なので,これを使って再度図(1.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()

f:id:twakamori:20210219012715p:plain
figure 1.4

それっぽく再現できた. たったの10サンプルなら正規方程式を使って解析的に解いた方が早いかもしれないが,そろそろ次に進みたいのでこれは一旦これで良しとする.