パーセプトロンの学習規則を1次元のデータに対して試してみる

2015-10-13
blog

「わかりやすいパターン認識」の2.3節「パーセプトロンの学習規則」(p.18)を1次元・2クラスの学習パターンに適用する例(p.23)を試してみた。

動作デモ

PerceptronLearning1D - JsFiddle

  • 緑の丸が拡張重みベクトルを表していて、「step」のボタンを押すごとに学習で赤い線と青い線を分離するパラメータを探す
    • 適用するパターンの順序は、本の記述とは違い、ランダムにしている
  • 「reset」ボタンで、拡張重みベクトルをランダムの位置からやり直す

パーセプトロンの学習規則

  1. 重みベクトル $\mathbf{w}$ の初期値を適当に設定する。
  2. $\chi$ の中から学習パターンを一つ選ぶ。
  3. 識別関数 $g(x) = \mathbf{w}^t \mathbf{x}$ によって識別を行い、正しく判定できなかった場合のみ次のように重みベクトル $\mathbf{w}$ を修正し、新しい重みベクトル $\mathbf{w}^\prime$ を作る。

    1. 上の処理(2), (3)を の全パターンに対して繰り返す。
    2. の全パターンを正しく識別できたら終了。誤りがあるときは2に戻る。

    コード

    上記の学習規則をJavaScriptで書くとこんな感じ:

    perceptron_learning.js

    // 学習パターンを識別関数に適用して誤識別した場合、パーセプトロンの学習規則に基づき重みを調整する
    // ws : 拡張重みベクトル
    // xs : 拡張特徴ベクトル
    // c : クラス (0 or 1)
    // rho: 学習係数ρ
    function learn(ws, xs, c, rho) {
    var g = dot(ws, xs); // 識別関数gを計算
    if (c == 0 && g <= 0) { // クラスω1を誤識別
    madd(ws, rho, xs); // w' = w + ρx
    return true;
    } else if (c != 0 && g >= 0) { // クラスω2を誤識別
    madd(ws, -rho, xs); // w' = w - ρx
    return true;
    }
    return false;
    }

    // 内積
    function dot(a, b) {
    var l = 0;
    for (var i = 0; i < a.length; ++i)
    l += a[i] * b[i];
    return l;
    }

    // 係数付き加算
    function madd(a, p, b) {
    for (var i = 0; i < a.length; ++i)
    a[i] += p * b[i];
    }

    多クラスの場合

    多クラス()への拡張は、に属するパターンをと誤ったとき、もしくは識別結果としての双方が候補となったとき()、重みベクトルの修正を

    とのこと。