はじめに
ニューラルネットワーク全盛期のいま,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という表記をしていますが,これを怠ると,コンパイル済みコンソールアプリでは整数型になってしまい上手く動作しません。
以上で完成です。