先日の #hasmoku でやろうとしてたSVM出来た。 https://gist.github.com/msakai/34fcd8d862fadfa1139a  #ml

自分で一から書いたのではなく、CourseraのMachine Learningのコース https://www.coursera.org/course/ml の課題で用意されていたMatlab/OctaveコードのHaskellへの翻訳。

以下の文献あたりを読んで、元のSVMのコードが何をやっているかだいたい理解できたので、Haskell + HMatrix に翻訳してみた。

Support vector machine - Wikipedia, the free encyclopedia
https://en.wikipedia.org/wiki/Support_vector_machine

SMO徹底入門 - SVMをちゃんと実装する
http://www.slideshare.net/sleepy_yoshi/smo-svm

Machine Learning のコースを受講したときは、 超平面で分離するという定義と、サンプル間で内積(やカーネル関数)を計算してという定義の関係をちゃんと理解できていなかったけれど、双対形式を導出して、ちゃんと繋がっているというのが理解できて良かった。

ただ、翻訳してみて、元のMatlab/Octaveコードの怪しい箇所を何箇所か発見してしまった。
* バイアス項の更新式がなんか変な気がする (が、ここはまだちゃんと理解できていない)
* RBFカーネルを使う際の予測式でバイアス項を使っていない
* 本質的ではないけど、処理パスの数え方がちょっと変なやり方になっている気がする。