タコい実装

splitSVM、以前実験したときは必要なメモリ容量を大きく減らそうとするとどうしても速度が劣化する感じだったのだけど、rare な素性同士の内積を取るのに std::vector を使っていたのを std::tr1::unordered_map にしたら、単純な PKE より速くなってしまった。
そもそも素性が非常に疎なときは PKI は PKE より速くなるので不思議ではないけど,以前 __gnu_cxx::hash_map で実装したときはダメだった気がするんだけどなぁ。結局、速度/精度を落とすことなく、組み合わせ素性の重みを格納したダブル配列のサイズを 1.1G -> 79M にできた。スバラシイ。
[追記] 以前使っていた素性セットでも試してみたところ、やはり splitSVM の方が速かった。二次だと重みベクトルのサイズがもともと小さいので意味がないが、三次や四次など、特に多項式カーネルの次数が高く PKI との差が小さいモデルだと効果が大きいようだ。__gnu_cxx::hash_map でやってみても結果は同じ感じ。論文で提案していた高速分類手法も splitSVM と組み合わせた方が速かった。これは嬉しい。