グラム(カーネル)行列の固有値分解で対応する特徴ベクトルを得る

類似度を設計するのと,特徴ベクトルを設計するのはどちらが難しいだろうか?とりあえず今は類似度を設計する方が簡単だとしよう.そしてその類似度が正定値カーネルになるように設計し,kとしよう:

– http://ibisforest.org/index.php?正定値カーネル

n個のデータ\{x_i\}_{i=1}^nを持っているとしよう.大事なのはxはなんでもいいってこと.文字列でも,木でも画像でも動画でも.ただ,類似度を設計すれば良い(この類似度を学ぶ枠組みもある).データとカーネルから,グラム行列(カーネル行列とも言われる)K, \ K_{ij}=k(x_i,x_j)を構成しよう.この段階で使える機械学習アルゴリズムは多々ある.例えばSVM,ロジスティック回帰,その他諸々.しかし,K \in \mathbb{R}^{n \times n}であり,nが大きくなると,すなわちデータが膨大な量だとこのまま使うのは計算量的にもメモリ的にも厳しい.

そこで,Kの固有値分解K=USU^Tを考えよう.なお,これらは固有値の大きい順にソートされているとする.そして,\Phi=US^{\frac{1}{2}}としよう.そうすると,K=\Phi\Phi^Tとなり,なんとこれが最初に設計した類似度に対応する特徴ベクトル(を縦並べたもの)になっている.さらに,Kはしばしばlow-rankであり,Sの対角成分の多くは0である.そこで,Sの固有値が0でないm個の成分だけ使おう.そうすると\Phi \in \mathbb{R}^{n \times m}となり低次元表現を得る.依然としてK=\Phi\Phi^Tである.

ここでmをコントロールすることで,Kの近似表現を得ることができると気づく.これである程度の近似性能を保ちながら,次元を削減することができる.ゲットした特徴ベクトルは,クラスタリングに投げたりできる.

しかしながら,大きな大きな問題がある.それはサンプルに入ってない新しい点が来たときにどうするか?ということ.そう,このままでは分類や回帰に使えない.これを今後調べていく.何かやり方をご存知だったら教えてください.

広告

emacs-jediで任意のvirtualenv環境を補完対象にする

emacs-jediが素晴らしいです.Python用の補完機能で,ヘルプなんかも表示してくれます.しかも高速に!emacs-jediについては以下が詳しいです.

– http://qiita.com/yuu116atlab/items/2a62cb880ac863dcc8ef

この補完機能なんですが,標準で入っていないパッケージはどう補完するのでしょうか?それについては以下に記載がありました.

– http://d.hatena.ne.jp/n-channel/20131220/1387551080

これによると”PYTHONPATH”という環境変数に設定したパス以下を見てくれるとのこと.なのでここをお使いのvirtualenv環境のsite-packagesにすれば動きます.virtualenvwrapperを使っている方は以下のようになるでしょう.

(setenv "PYTHONPATH" "~/.virtualenv/path/to/your/site-packages/")

これで動きます.素晴らしいです!

word2vecで学習したベクトル表現を使って分類器を作ってみる

word2vecが流行っていますね.僕も3ヶ月前くらいから触り始めました.これ,どうしても類似度に目がいくんですけど,よい類似度っていうのは目的によりけりなので一般的に評価しづらいです.なのでこの手の論文とかでもうまくいった例を幾つか載せて定性的に評価していることがあります.今回は,ベクトル表現学習の”上のタスク”である分類問題においてこの有効性を評価してみます.

今,「犬の名前なのか猫の名前なのかを分類する分類器を作りたい」人がいるとします.機械学習的なアプローチだと,犬の名前,猫の名前をいくつかピックアップしてデータを作り,学習させて評価します.コードは以下に載せておきます(もし試したい人がいたら,モデルはご自身のを!).

結果は以下のようになりました.


dog:110, cat:30 on training
best parameters: {'C': 10.0, 'gamma': 0.077426368268112694}
CV score: 0.942857142857
0.92
サセックス・スパニエルは犬です
スピノーネ・イタリアーノは犬です
ハバニーズは犬です
フィールド・スパニエルは犬です
ブラッコ・イタリアーノは犬です
ホファヴァルトは犬です
ベルジアン・グリフォンは犬です
ドレーファーは犬です
アメリカン・アキタは犬です
アメリカン・フォックスハウンドは犬です
コモンドールは犬です
イビザン・ハウンドは犬です
イングリッシュ・フォックスハウンドは犬です
スコティッシュ・ディアハウンドは犬です
カナーン・ドッグは犬です
クーバースは猫です
グレーター・スイス・マウンテン・ドッグは犬です
ハリアは犬です
ブラック・アンド・タン・クーンハウンドは犬です
ブラック・ロシアン・テリアは犬です
マンチカンは猫です
メインクーンは猫です
ラガマフィンは猫です
ラグドールは猫です
ロシアンブルーは犬です

CVスコアが0.94 で定量的にみてもうまく分類できていますね.ちなみにこのモデルだと,”マンチカン”と似ている単語TOP10は以下のようになります.

ヘラジカ 0.800116658211
ハサミムシ 0.790722727776
ゴールデン・レトリバー 0.780578136444
ホウセンカ 0.777512967587
グレート・デーン 0.774465680122
オカメインコ 0.769641637802
イソギンチャク 0.769312798977
スコティッシュフォールド 0.769262313843
ゲッカビジン 0.766306519508
リャマ 0.765630722046

ここまで見ると動物同士が似てしまっている,動物の分類には使えない!となりそうですが,世の中には強力な分類器が存在していますのであまり類似度だけをみて判断するのはよくなさそうです.

今回はword2vecで学習したベクトル表現を使って単語の分類問題に挑戦してみました.今回はなかなかうまくいったので,他の応用にも使えそうです!!