一日坊主

雰囲気でやっている

PRML上巻 P8

昨日の続き.

いろいろな次数の多項式について得られた係数\mathbf{w}^*の値を検証してみる. (コードは省略)

M=0 M=1 M=3 M=9
w_ 0^ * 0.09 -1.36 21.09 524.49
w_ 1^ * 0.77 -31.88 -8747.08
w_ 2^ * 10.88 30200.27
w_ 3^ * 0.01 -46656.18
w_ 4^ * 38429.23
w_ 5^ * -17576.78
w_ 6^ * 4319.81
w_ 7^ * -522.06
w_ 8^ * 28.31
w_ 9^ * 0.10

Mの増加に伴って,係数の多くが大きな値をとるようになっている.

次に,モデルの次数は固定し,データ集合のサイズを変えてみたときの振る舞いを確認する. (一時変数名が適当ですいません)

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import numpy.polynomial.polynomial as poly
np.random.seed(42)
# test data set (N=15)
# t = sin(2 \pi x) + gaussian noise
x4 = np.linspace(0, 1, 15)
t4 = np.sin(2 * np.pi * x4) + np.random.normal(0, 0.2, 15)
# test data set (N=100)
# t = sin(2 \pi x) + gaussian noise
x1 = np.linspace(0, 1, 100)
t3 = np.sin(2 * np.pi * x1) + np.random.normal(0, 0.2, 100)
# figure 1.6
# fitting with polynomial functions
w9_15 = np.polyfit(x4, t4, 9)
w9_100 = np.polyfit(x1, t3, 9)

# visualize
fig, axs = plt.subplots(1, 2, figsize=(12, 4))
axs[0].set_title('N = 15')
axs[1].set_title('N = 100')

for ax in axs.flat:
    ax.plot(x1, t1, color='green')
    ax.set(xlabel='x', ylabel='t')

axs[0].scatter(x4, t4, facecolor='None', edgecolor='blue')
axs[0].plot(x1, np.poly1d(w9_15)(x1), color='red')
axs[1].scatter(x1, t3, facecolor='None', edgecolor='blue')
axs[1].plot(x1, np.poly1d(w9_100)(x1), color='red')

plt.tight_layout()

f:id:twakamori:20210220195022p:plain
figure 1.6

図から,データ集合のサイズが大きくなるにつれて過学習の問題は深刻でなくなってくることがわかる.

大雑把な経験則としては,データの点の数はモデル中の適応パラメータの数の何倍か(例えば5とか10)よりは小さくてはいけない,といわれているらしい.

今日はここまで.