Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

ADALINEのコスト関数を行列で表記

ADALINEのコスト関数、またその勾配は、行列で表してやると非常にすっきりと書くことができます。

numpyでは行列演算が可能なので、コーディングの際もそのまま行列として扱うことができて便利です。

numpy内で行列演算が最適化されている(はず)なので、for文で回すよりも行列表記にした方が、演算効率が上がります。

特徴行列(トレーニングサンプル行列)

行がトレーニングサンプルを表し、列が特徴量を表しています。 m,nはそれぞれトレーニングサンプルと特徴量の個数を表しています。 一番左の列に1が入っているのは、しきい値を含んだ重みベクトルとの積を取ることを考慮しているためです。

 {
\displaystyle
\begin{eqnarray}
\mathbf{X}=\left[
\begin{array}{ccccc}
1 & x_{11} & x_{12} & \cdots & x_{1n} \\
1 & x_{21} & x_{22} & \cdots & x_{2n} \\
\vdots & \vdots & \vdots & \ddots & \vdots \\
1 & x_{m1} & x_{m2} & \cdots & x_{mn}
\end{array}
\right]
\end{eqnarray}
    \tag{1}
}
教師データベクトル
 {
\displaystyle
\begin{eqnarray}
\mathbf{y}=\left[
\begin{array}{c}
y_{1} \\
y_{2} \\
\vdots \\
y_{m}
\end{array}
\right]
\end{eqnarray}
    \tag{2}
}
重みベクトル

 {w_0}しきい値になります。

 {
\displaystyle
\begin{eqnarray}
\mathbf{w}=\left[
\begin{array}{c}
w_{0} \\
w_{1} \\
w_{2} \\
\vdots \\
w_{n}
\end{array}
\right]
\end{eqnarray}
    \tag{3}
}
活性化関数出力ベクトル

{\alpha}は適当な定数です。

 {
\displaystyle
\mathbf{\phi}=\alpha \mathbf{X} \mathbf{w}
    \tag{4}
}
教師データと活性化関数出力の残差ベクトル
 {
\displaystyle
\begin{align}
\mathbf{e} &= \mathbf{y} - \mathbf{\phi} \\
                  &= \mathbf{y} - \alpha \mathbf{X} \mathbf{w}
\end{align}
    \tag{5}
}
コスト関数

右肩のTは転置行列(行と列をひっくり返す)を表します。

 {
\displaystyle
\begin{align}
J(\mathbf{w})&=\frac{1}{2}\mathbf{e}^T\mathbf{e} \\

  &=\frac{1}{2} \left[ (\mathbf{y} - \alpha \mathbf{X} \mathbf{w})^T (\mathbf{y} - \alpha \mathbf{X} \mathbf{w}) \right] \\

  &=\frac{1}{2} \left[ \mathbf{y}^T\mathbf{y} - \alpha \mathbf{w}^T\mathbf{X}^T\mathbf{y} -\alpha \mathbf{y}^T \mathbf{X} \mathbf{w} + \alpha^2 \mathbf{w}^T\mathbf{X} ^T \mathbf{X} \mathbf{w} \right]
\end{align}
    \tag{6}
}
コスト関数の勾配
 {
\displaystyle
\begin{align}
\frac{\partial J(\mathbf{w})}{\partial \mathbf{w}}&=\frac{\partial }{\partial \mathbf{w}}\frac{1}{2}\mathbf{e}^T\mathbf{e} \\

&=\frac{\partial }{\partial \mathbf{w}}\frac{1}{2} \left[ \mathbf{y}^T\mathbf{y} - \alpha \mathbf{w}^T\mathbf{X}^T\mathbf{y} -\alpha \mathbf{y}^T \mathbf{X} \mathbf{w} + \alpha^2 \mathbf{w}^T\mathbf{X} ^T \mathbf{X} \mathbf{w} \right] \\

&=\frac{1}{2} \left[ \frac{\partial \mathbf{y}^T\mathbf{y}}{\partial \mathbf{w}} - \alpha\frac{\partial  \mathbf{w}^T\mathbf{X}^T\mathbf{y}}{\partial \mathbf{w}} - \alpha\frac{\partial  \mathbf{y}^T \mathbf{X} \mathbf{w}}{\partial \mathbf{w}} + \alpha^2 \frac{\partial  \mathbf{w}^T\mathbf{X} ^T \mathbf{X} \mathbf{w}}{\partial \mathbf{w}} \right] \\

&=\frac{1}{2} \left[ 0 - \alpha\mathbf{X}^T\mathbf{y} - \alpha( \mathbf{y}^T \mathbf{X})^T + \alpha^2 \mathbf{X} ^T \mathbf{X} \mathbf{w} + \alpha^2  (\mathbf{w}^T\mathbf{X} ^T \mathbf{X})^T\right] \\

&=- \alpha\mathbf{X}^T\mathbf{y} + \alpha^2 \mathbf{X} ^T \mathbf{X} \mathbf{w}
\end{align}
    \tag{7}
}
numpyでの行列表記

参考にさせて頂いたページ