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

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

3.1 Widrow-Hoffの学習規則

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

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

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

学習パターン

学習パターン

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

教師マトリクス

教師マトリクス

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

識別関数のウェイト

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

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

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

から計算:

これによって

となり、 との間で識別する値が学習できている。

コード

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