LemonteaのUnity部屋

C#とかのお話です~

機械学習 教師有り 回帰 直線モデルの解析解

こんにちは。レモンティーです。

今回は直線モデルの解析解についてです。
前回↓、直線モデルのw0,w1を勾配法で求めました。
sawalemounity.hatenablog.com

しかし直線モデルの場合、勾配法を使わなくても
方程式を解くことで最適なw0,w1を一発で求めることができます。
このような解を解析解と言います。

それではやってみます。
前回同様、モデルと実際の値の二乗平均誤差
{\displaystyle
\ J = \frac{1}{N} \sum_{k=1}^{N-1}  (y_n-t_n)^2 \
}
がなるべく小さくなるw0,w1を求めるのが目的です。

直線モデルのJはすり鉢のような形をしているので
極小値が一つだけあり、それが最小値ですから
Jが極小値をとるw0,w1を求めればいいわけです。

Jが極小値をとるとき、その地点での傾きは0なので
{\displaystyle
\frac{\partial J}{\partial w_0} = 0 \
}
{\displaystyle
\frac{\partial J}{\partial w_1} = 0 \
}
となります。
このようなw0,w1の組を求めればOKですね。

つまり↓の①、②を満たすw0,w1を求めます。
{\displaystyle
\frac{2}{N} \sum_{n=1}^{N-1}  (w_0x_n+w_1-t_n)x_n  = 0 …① \
}
{\displaystyle
\frac{2}{N} \sum_{n=1}^{N-1}  (w_0x_n+w_1-t_n) = 0  …② \
}


①より
{\displaystyle
\frac{2}{N} \sum_{n=1}^{N-1}  (w_0x_n+w_1-t_n)x_n  = 0 \
}
{\displaystyle
\frac{1}{N} \sum_{n=1}^{N-1}  (w_0x_n+w_1-t_n)x_n  = 0 \
}
{\displaystyle
\frac{1}{N} \sum_{n=1}^{N-1}  w_0x_n^2 +  \frac{1}{N} \sum_{n=1}^{N-1} w_1x_n  - \frac{1}{N} \sum_{n=1}^{N-1}  t_nx_n = 0\
}
{\displaystyle
w_0\frac{1}{N} \sum_{n=1}^{N-1}  x_n^2 +  w_1\frac{1}{N} \sum_{n=1}^{N-1} x_n  - \frac{1}{N} \sum_{n=1}^{N-1}  t_nx_n = 0\
}

ここで関数f(x)の(0<= n <=N-1)の平均値を< f(x) >と表すと
{\displaystyle
w_0< x^2 > +  w_1< x >  -  < tx > = 0 …①' 
}


同様に②より
{\displaystyle
w_0< x > +  w_1  -  < t > = 0 …②' 
}



②'より
{\displaystyle
w_1 = < t > - w_0< x > …③
}

③,①'より
{\displaystyle
w_0< x^2 > +  < t >< x > - w_0< x >^2  -  < tx > = 0
}
{\displaystyle
w_0 =  \frac{ < tx > - < t >< x > }{ < x^2 > - < x >^2 }
}

よって
{\displaystyle
w_1 = < t > -  \frac{ < tx > - < t >< x > }{ < x^2 > - < x >^2 } < x > 
}

これで、w0,w1が各関数の平均値
{\displaystyle
< x >< x^2 >< t >< tx >
}
で表されたので、↓のような関数を定義して
正確な値を求めてみます。

def fit_line(x,t):
    mx = np.mean(x)
    mt = np.mean(t)
    mtx = np.mean(t*x)
    mxx = np.mean(x*x)
    w0 = (mtx - mt*mx)/(mxx - mx**2)
    w1 = mt - w0*mx
    return np.array([w0,w1])

f:id:sawalemontea:20180315182059p:plain

勾配法の時となかなか近い値がでましたね。
ですが勾配法での誤差は0.357時間だったので
やはり解析解のほうがわずかに精度が高いようです。

計算も一回ですむしコードの量も少なく
結果の精度が高いので直線モデルの時は
勾配法よりよさそうですね。

今回はこれでおしまいです。
sawalemounity.hatenablog.com