libSVMを高速化

libSVMを普通の線形カーネルで動作させていたのだが、どうも思ったほどスピードが出ない。
おかしいと思って、ソースを解析してみたら、プログラム構造が「美しさ重視?」のためか、カーネル処理が線形/非線形によらず共通化してあることが分かった。
線形の場合は毎回結果が同じになる「サポートベクトルの内積」を毎回計算しなおしているのである。これでは遅くなるわけだ。
しゃーないな、というわけで、線形の場合だけ処理をバイパスして高速化するように修正してみた。
やったね!、特徴空間の次元数にもよるが、約80から100倍ほど高速に動作するようになった。
このパッチ、作者に送るべきだろうか?
とりあえず、LIBLINEAR(http://tmasada.exblog.jp/7814609/) とスピードを較べてからかな。


関連ページ:
http://d.hatena.ne.jp/tsimo/20080224/1203825833
http://d.hatena.ne.jp/momo_dev/20080331/p2