イラストで学ぶ機械学習のP22のソースコードをJuliaで書いてみた.

杉山将先生の「イラストで学ぶ機械学習」p22のソースコードをjuliaで書き換えてみました.
jupyter labで実行しました.
これでは過学習(過適合)しているので,次の章では正則化などが行われるようになります.
次はそれを書いていこうと思います.

モデルの出力f _ { \boldsymbol { \theta } } \left( \boldsymbol { x } _ { i } \right)と訓練出力\left\{ y _ { i } \right\} _ { i = 1 } ^ { n }との二乗誤差を

    \[J _ { \mathrm { LS } } ( \theta ) = \frac { 1 } { 2 } \sum _ { i = 1 } ^ { n } \left( f _ { \theta } \left( \boldsymbol { x } _ { i } \right) - y _ { i } \right) ^ { 2 }\]


とします.この二乗誤差を最小化するように学習します.
計画行列を

    \[\Phi = \left( \begin{array} { c c c } { \phi _ { 1 } \left( x _ { 1 } \right) } & { \cdots } & { \phi _ { b } \left( x _ { 1 } \right) } \\ { \vdots } & { \ddots } & { \vdots } \\ { \phi _ { 1 } \left( x _ { n } \right) } & { \cdots } & { \phi _ { b } \left( x _ { n } \right) } \end{array} \right)\]


と定義すると二乗誤差は

    \[J _ { \mathrm { LS } } ( \theta ) = \frac { 1 } { 2 } \| \Phi \theta - y \| ^ { 2 }\]

と表現できます.
これをθに対して偏微分すると

    \[\nabla _ { \boldsymbol { \theta } } J _ { \mathrm { LS } } = \left( \frac { \partial J _ { \mathrm { LS } } } { \partial \theta _ { 1 } } , \dots , \frac { \partial J _ { \mathrm { LS } } } { \partial \theta _ { b } } \right) ^ { \top } = \Phi ^ { \top } \Phi \theta - \Phi ^ { \top } y\]


となり.

これをゼロといて式変形すると

    \[\Phi ^ { \top } \Phi \theta = \Phi ^ { \top } y\]


を満たすことが分かります.ソースコードではこの性質を用いて書かれています.

using Plots
gr()
n = 50
N = 1000
x = linspace(-3, 3, n)'
X = linspace(-3, 3, N)'

pix = π .* x
y = vec(sin.(pix) ./ (pix)) + 0.1 * vec(x) + 0.05 *randn(n,1)

p = ones((n,1))
P = ones((N,1))

for j in 1:15
p = hcat(p, vec(sin.(j./2 .* x)))
p = hcat(p, vec(cos.(j ./2 .* x)))

P = hcat(P, vec(sin.(j ./2 .* X)))
P = hcat(P, vec(cos.(j ./ 2 .*X)))
end
t = p \y
F = P*t

scatter(x',y,ylim=(-1,1.3),legend=false)
plot!(X',F,legend=false)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください