しろかい!

アプリ開発や機械学習などの開発Tips.

LIBSVMの学習データをコサイン正規化するスクリプト書いた

機械学習の1手法であるSVMのライブラリ「LIBSVM」の入力データを,コサイン正規化するPythonスクリプトを書いたので公開します.

f:id:shun9167:20150126192101p:plain

先日以下のようなエントリを投稿しました.
この時は標準正規分布に従うようにスケーリング(zscoreを計算)する必要があったのですが,色々わけあって今度はコサイン正規化する必要がでてきました.
というわけでまた書いちゃいました.

ソースコード

ソースコードは今回も例によってGistにあげておきました.

使い方

ソースコード上部のコメントに書いてある通りです.

以下のようなLIVSVMの入力データ(train.txt)があるとします.

-1 1:6.000000 2:148.000000 3:72.000000 4:35.000000 5:0.000000 6:33.599998 7:0.627000 8:50.000000
+1 1:1.000000 2:85.000000 3:66.000000 4:29.000000 5:0.000000 6:26.600000 7:0.351000 8:31.000000
-1 1:8.000000 2:183.000000 3:64.000000 4:0.000000 5:0.000000 6:23.299999 7:0.672000 8:32.000000

これを下記コマンドでコサイン正規化を実行します.

$ python libsvm_cos-normalize.py -i train.txt

実行が終わると「入力ファイル名.cos-normalize.scale」というコサイン正規化後の学習データファイルが出力されます.
中身はこんな感じです.

-1 1:0.0335523701502 2:0.827625130371 3:0.402628441802 4:0.195722159209 6:0.187893261657 7:0.00350622268069 8:0.279603084585 
+1 1:0.00842400400082 2:0.71604034007 3:0.555984264054 4:0.244296116024 6:0.224078506422 7:0.00295682540429 8:0.261144124025 
-1 1:0.0403976822483 2:0.92409698143 3:0.323181457986 6:0.117658244498 7:0.00339340530886 8:0.161590728993  

試しにある事例について,ベクトルのノルム(長さ)を求めると1になり,コサイン正規化されていることが分かるかと思います.

なお,利用の際は自己責任でお願いします.大丈夫だとは思いますが,バグなどあっても責任は負えません.

そもそもコサイン正規化とは?

一言で言うと,「ベクトルのノルムを1にすること」です.
具体的には,各成分をベクトルのノルムで割ることにより正規化されます.
文書をTFIDFなどによりベクトル化した際によく行われる手法です.
(学習データが文書ベクトルの時に,このスクリプトを使うことになるかと思います.)

詳しくは以下のページを見てみてください.
他にも「文書ベクトル 正規化」ってググれば色々出てきます.
ベクトル空間モデル

参考