さらにSVM

TinySVMにはドキュメントらしきものがついていなかった(と思う)が、LibSVMにはがっちりついていたので、読んでみる。


『スケーリングの重要さについて』

Scaling them before applying SVM is very important.
(SVMを適応する前にデータにスケーリングを行うことはとても重要である。)


その理由1

The main advantage is to avoid attributes in greater numeric ranges dominate those in smaller numeric ranges.
(利点1:大きな数値の範囲でのアトリビュートが小さな数値の範囲でのアトリビュートを支配するのを避けること)


その理由2

Another advantage is to avoid numerical difficulties during the calculation. Because kernel values usually depend on the inner products of feature vectors.
(利点2:カーネルの値は通常、特徴ベクトルの内積の値に依存するので、計算の困難さを避けることができる。)


とのこと。


あたり前といっちゃあたり前のことである。
でも、TinySVMを使っていたときにはこの辺のことはあまり考慮に入れていなかった。


早速パッケージに含まれているスケーリングを行ってれるというプログラムを実行。
なんかうまくいってない。


てなわけで自分でスケーリングプログラムを組んでみることに。
要は、遺伝子の発現量をある幅にそろえてやりましょう、というところかな。
各遺伝子ごとに((その遺伝子の発現量)−(最小の発現量))/((最大の発現量)−(最小の発現量))としてやればよし。
これで[0,1]にスケーリングできる。
値を2倍して1引けば[-1,1]にスケーリングできる。

追記

確かに、スケーリングする前は遺伝子数をかなり小さく絞ってSVMを実行すると「謎の停止」現象が起こっていたが、スケーリング後は改善された。


確かに遺伝子ごとに発現量のスケールが違うのだから、遺伝子数が少なくなると超平面が引きにくくなるかも、という考察。
実際にうまくいっているので、この辺はゆるぎない事実。