「わかりやすいパターン認識」の2.3節「パーセプトロンの学習規則」(p.18)を1次元・2クラスの学習パターンに適用する例(p.23)を試してみた。
動作デモ
PerceptronLearning1D - JsFiddle
- 緑の丸が拡張重みベクトルを表していて、「step」のボタンを押すごとに学習で赤い線と青い線を分離するパラメータを探す
- 適用するパターンの順序は、本の記述とは違い、ランダムにしている
- 「reset」ボタンで、拡張重みベクトルをランダムの位置からやり直す
パーセプトロンの学習規則
- 重みベクトル \(\mathbf{w}\) の初期値を適当に設定する。
- \(\chi\) の中から学習パターンを一つ選ぶ。
- 識別関数 \(g(x) = \mathbf{w}^t \mathbf{x}\) によって識別を行い、正しく判定できなかった場合のみ次のように重みベクトル \(\mathbf{w}\) を修正し、新しい重みベクトル \(\mathbf{w}^\prime\) を作る。
$$ \mathbf{w}^\prime = \begin{cases} \mathbf{w} + \rho \cdot \mathbf{x} (\omega_1 のパターンに対して g(\mathbf{x}) \le 0 となったとき) (2.26) \\ \mathbf{w} - \rho \cdot \mathbf{x} (\omega_2 のパターンに対して g(\mathbf{x}) \ge 0 となったとき) (2.27) \end{cases} $$
- 上の処理(2), (3)を \(\chi\) の全パターンに対して繰り返す。
- \(\chi\) の全パターンを正しく識別できたら終了。誤りがあるときは2に戻る。
コード
上記の学習規則をJavaScriptで書くとこんな感じ:
perceptron_learning.js
// 学習パターンを識別関数に適用して誤識別した場合、パーセプトロンの学習規則に基づき重みを調整する |
多クラスの場合
多クラス(\(c \gt 2\))への拡張は、\(\omega_i\)に属するパターンを\(\omega_j\)と誤ったとき、もしくは識別結果として\(\omega_i\)と\(\omega_j\)の双方が候補となったとき(\(i \ne j\))、重みベクトルの修正を
$$ \begin{align*} \mathbf{w_i}^\prime &= \mathbf{w_i} + \rho \cdot \mathbf{x} \\ \mathbf{w_j}^\prime &= \mathbf{w_j} - \rho \cdot \mathbf{x} \tag{2.27} \end{align*} $$
とのこと。