とりあえずの目標はサポートベクターマシンてことで、次のサイト参考に組んでみました。*1
http://www.neuro.sfc.keio.ac.jp/~masato/study/SVM/index.htm
なんか、なぜかちゃんと角度的にはいい感じになってるけど、ぜんぜんマージン最大化していません。見てみたら、λは0以下にならないはずなのに、-4000とかになってるし。
で、よく考えたら、どうにか無理やり
の条件にあてはめてやってたけどλ≧0っていう条件を考えていないし、といろいろ試行錯誤して、どうも単純な最急降下法でやるのがまずいんじゃないかなと思ったのです。
上記のサイトでは「それは考えてみてよ.」と軽く書いてあったけど、これって、研究分野になるじゃないの?
結局、そういうのをどうにかするために、SMO法とかSVMLightとかいう分割法があって、それを使わないといけないということまでわかりました。
SMO法はサポートベクターマシン入門に載ってて & いまのところ実装方法が載ってる唯一の日本語の本なのだけど、福岡においてきてしまった*2。なので福岡に戻るまでおあづけかなぁ。もう一冊買っちゃおうかな。
ただ、上記のサイトは2003年と古くて、そのころはサポートベクターマシンに関する本はまったくでてないし、恐らくWebでも情報がなかったと思うので、しかたないと思われます。
bの求め方も上記サイトの式ではうまくいかなかったので、次のようにしてます。
とりあえず、ちゃんと動いてないソース。
実行にはid:nowokay:20080327のGraph.java、id:nowokay:20080326のLerningMachine.javaが必要です。
*1:サポートベクターマシンについては、はてなキーワード作って書いておきました
*2:今、東京にいる