「誤差評価に基づく学習」の「閉じた形の解」で例題を解いてみる

2015-11-06

わかりやすい パターン認識

第3章 誤差評価に基づく学習

3.1 Widrow-Hoffの学習規則

「[2] 閉じた形の解(p.35)」を例題に当てはめて解いてみる。

例題は以前パーセプトロンの学習規則を使って試した、2.3節「パーセプトロンの学習規則」(p.18)で、特徴が1次元の6個のパターンを2クラスに分類する例。

添字が多くてイメージがわかないので、まずは展開して計算してみる。

学習パターン

学習パターン \(\mathbf{X}\)

$$ \mathbf{X} = \begin{bmatrix} \begin{pmatrix}1 & 1.2\end{pmatrix} \\ \begin{pmatrix}1 & 0.2\end{pmatrix} \\ \begin{pmatrix}1 & -0.2\end{pmatrix} \\ \begin{pmatrix}1 & -0.5\end{pmatrix} \\ \begin{pmatrix}1 & -1.0\end{pmatrix} \\ \begin{pmatrix}1 & -1.5\end{pmatrix} \end{bmatrix} $$

  • 行ベクトルが各パターン(列の数はバイアスの分を加えるので、1+特徴次元数=2)で、行数はパターン数(=6)

教師マトリクス

教師マトリクス \(\mathbf{b}\)

$$ \mathbf{b} = \begin{bmatrix} \begin{pmatrix}1 & 0\end{pmatrix} \\ \begin{pmatrix}1 & 0\end{pmatrix} \\ \begin{pmatrix}1 & 0\end{pmatrix} \\ \begin{pmatrix}0 & 1\end{pmatrix} \\ \begin{pmatrix}0 & 1\end{pmatrix} \\ \begin{pmatrix}0 & 1\end{pmatrix} \end{bmatrix} $$

  • 行ベクトルが各クラスでの教師信号で、行数はパターン数(=6)、列数はクラス数=2
  • パターンがクラス\(i\)に属していれば列\(i\)が\(1\)、それ以外は\(0\)という教師信号

識別関数のウェイト

$$ \mathbf{W} = \begin{bmatrix} \begin{pmatrix} w_{10} \\ w_{11} \end{pmatrix} & \begin{pmatrix} w_{20} \\ w_{21} \end{pmatrix} \end{bmatrix} $$

  • 求めるべき値
  • 列ベクトルが各識別関数のウェイト(1+特徴次元数=2)で、列の数は分類したいクラスの数(=2)

識別関数のウェイトを閉じた形で求める

全クラス、全パターンの識別関数に対する教師信号との二乗誤差$J$を、各ウェイトベクトルで偏微分した値を0と置いて、最小解を求める。

$$ (\mathbf{X}^t \mathbf{X}) \mathbf{W} = \mathbf{X}^t \mathbf{b} \tag{3.21} $$

から計算:

$$ \begin{align*} \left\lparen \begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 1 \\ 1.2 & 0.2 & -0.2 & -0.5 & -1.0 & -1.5 \end{bmatrix} \begin{bmatrix} 1 & 1.2 \\ 1 & 0.2 \\ 1 & -0.2 \\ 1 & -0.5 \\ 1 & -1.0 \\ 1 & -1.5 \end{bmatrix} \right\rparen \mathbf{W} &= \begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 1 \\ 1.2 & 0.2 & -0.2 & -0.5 & -1.0 & -1.5 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 1 & 0 \\ 1 & 0 \\ 0 & 1 \\ 0 & 1 \\ 0 & 1 \end{bmatrix} \\ \begin{bmatrix} 6 & -1.8 \\ -1.8 & 5.02 \end{bmatrix} \mathbf{W} &= \begin{bmatrix} 3 & 3 \\ 1.2 & -3 \end{bmatrix} \\ \therefore \mathbf{W} &= \begin{bmatrix} 0.640625 & 0.359375 \\ 0.46875 & -0.46875 \end{bmatrix} \end{align*} $$

これによって

$$ \begin{align*} (w_{10} - w_{20}) \cdot 1 + (w_{11} - w_{21}) x &= 0 \\ (0.640625 - 0.359375) + (0.46875 + 0.46875) x &= 0 \\ \therefore x &= -0.3 \end{align*} $$

となり、\(x3=-0.2\) と \(x4=-0.5\) との間で識別する値が学習できている。

コード

PythonのNumPyを使って、プログラムで計算してみる:

learn_error_close.py

# coding: UTF-8
import numpy as np

def main():
# パターン行列
X = np.matrix([[1., 1.2],
[1., 0.2],
[1., -0.2],
[1., -0.5],
[1., -1.0],
[1., -1.5]])
# パターンごとの、クラスiに属するかどうかの教師行列
b = np.matrix([[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.],
[0., 1.],
[0., 1.]])

# 識別関数のウェイトを求める
W = learn_error_close(X, b)
print 'W:'
print W

x = -(W[0, 0] - W[0, 1]) / (W[1, 0] - W[1, 1])
print 'x=', x


# 「誤差評価に基づく学習」の「閉じた形の解」
def learn_error_close(X, b):
W = np.linalg.solve(X.T * X, X.T * b)
return W

if __name__ == '__main__':
main()

# W:
# [[ 0.640625 0.359375]
# [ 0.46875 -0.46875 ]]
# x= -0.3