LoginSignup
3
0

More than 3 years have passed since last update.

日本語プログラミング言語「プロデル」でSVMを構築する

Last updated at Posted at 2019-12-05

はじめに

ニューラルネットワーク全盛期のいま,SVMを見聞きすることはなくなってしまったのですが,手軽に使えて好きなので,プロデルで実装したいと思います。

  • 高村大也著「言語処理のための機械学習入門」(コロナ社)

を参考にしました。

実装する

使い方

[サポートベクタマシン種類のインスタンス]が【訓練用データ】と【正解ラベル】を【{閾値,学習率}】で学習する
[サポートベクタマシン種類のインスタンス]が【推定したいデータ】を推定する

という文法で学習と推定を行えるようにします。

カーネルを作る

まず,カーネル関数を作ります。RBFカーネルが基本ですが,一旦線形カーネルを実装しました。

線形カーネルとは
    +全部
    【学習用データ】
    はじめ(データ)の手順
        全部は,データを転置したものにデータを左からかけたもの。
        学習用データは,データ。
    終わり
    自分で【推定用データ:行列】を計算する手順
        推定用データを転置したものに学習用データを左からかけたものを返す。
    終わり
終わり

これからサポートベクタマシン種類を作りますが,宣言時にカーネル関数種類のインスタンスを引数として要求します。

SVMを作る

サポートベクタマシンとは
    【カーネル】を持つ。
    【切片】を持つ。
    +パラメータ
    はじめ(使用カーネル)の手順
        カーネルは,使用カーネル。
    終わり
終わり

コンストラクタでは,カーネル関数を指定しておきます。

パラメータというのは,$\alpha$のことです。

次に,学習部分を実装します。

方針としては,双対問題のラグランジュ関数を最大化(マイナスをつけて最小化)するのに,最急降下法を用います。

自分が【データ:行列】と【正解:行列】を【引数:配列】で学習する手順
    【閾値】は,引数(1)。
    【学習率】は,引数(2)。
    パラメータは,行列(データの大きさ(1),1)を作ったもの。
    今回勾配は,100.0。
    今回勾配の絶対値が閾値以下になるまで繰り返す
        勾配は,正解を転置したものを正解に右からかけたものにカーネルの全部をかけたものにパラメータを右からかけたものに-1を全部かけたものに1を全部足したもの。
        パラメータは,勾配に学習率を全部かけたものをパラメータに加算したもの。
        今回勾配は,勾配の各列の和の中身(1)(1)。
        今回勾配をコンソールに表示して改行。
    繰り返し終わり
    【あ】は,{}。
    あは,パラメータを転置したものを[カーネルの全部に正解を全部かけたもの]に左からかけたものの中身(1)。
    切片は,あの平均。
終わり

途中で謎の配列【あ】が宣言されていますが,これはコンパイル済みコンソールアプリで配列を扱う際に生じるエラーを回避するためのものです。本当は,

切片は,パラメータを転置したものをカーネルの全部に正解を全部かけたものに左からかけたものの中身(1)の平均。

とやりたいのですがエラーが出ます。

勾配の初期値を100にしていますが,特に意味はありません。

次に,推定部分を実装します。推定は,学習時に作ったサポートベクタをかけて正負の判定をするだけです。

自分が【データ:行列】を推定する手順
    結果は,パラメータを転置したものを(カーネルでデータを計算したものに正解を全部かけたもの)に左からかけたものを転置したものから切片を全部引いたもの。
    【計算後】は,行列(結果の大きさ(1),1)を作ったもの。
    結果の大きさ(1)回,カウンタにカウントして繰り返す
        もし結果の中身(カウンタ)(1)が0.0より大きいなら
            計算後の中身(カウンタ)(1)は,1。
        でないなら
            計算後の中身(カウンタ)(1)は,-1。
        もし終わり
    繰り返し終わり
    計算後を返す。
終わり

ここで正負の判定時に0.0という表記をしていますが,これを怠ると,コンパイル済みコンソールアプリでは整数型になってしまい上手く動作しません。

以上で完成です。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0