non-Negative Matrix Factorization (NMF)

以前に Latent Semantic Indexing (LSI) や HITS 絡みで SVD や主成分分析について少し書きました。

LSI では SVD を使って単語文書行列を分解し、低階数近似を行います。これにより、似たような次元をまとめたりといった効果が得られるのでした。自分の考察では HITS も同様のことを行っているという認識でした。

さて、集合知プログラミングを読んでいたら、第10章で "non-Negative Matrix Factorization" (非負値行列因子分解, 以下NMF) という手法が出てきました。NMF も SVD や主成分分析に同じく行列を分解する手法で、マイニングにも応用されます。全要素がすべて非負の行列に対して使える手法です。

non-Negative Matrix Factorization

ある行列 X があった時に、X = WH となるような二つの行列の積 W と H に分解します。すると W の行、H の列に、X にはなかった量 (一般的に何と言えばいいのかわからないので、ひとまず量と言っておきます) が表れます。書籍内では、この量を "特徴" と呼んでます。

例えば文書-単語行列 X を NMF で X = WF 分解すると、文書-特徴行列の W と特徴-単語行列の F に分解されます。この W と F を、要素の値の大きさに従って解析するとしたとき、W の各要素は各特徴(列)が文書(行)に対してどの程度重要かを表しますし、F の各要素はある単語(列)が各特徴(行)に対してどの程度作用するかを表現することになります。このとき、クエリとして適当な単語の集合があったとして、まず F から、その単語の集合と最も適合する特徴ベクトル(行)を得ることができます。そしてその特徴ベクトルに最も適合するであろう行を W から選ぶと、文書が得られます。この文書は最初のクエリとして与えた集合に関連する文書です。結果として NMF によりテキストマイニングをしたことになります。

このように NMF で行列を分解して得られる特徴を使ってマイニングをする手法が、集合知プログラミング10章の内容でした。

NMF で行列を分解する実装は比較的簡単です。X = WF の W、F の全要素をランダムな正の値で埋めておき、全要素を更新しながら反復計算を行います。要素の値の更新のたび、X と WF の距離を計算し、この距離を最小化していく方向で計算を進めます。距離関数には二乗誤差 (フロベニウスノルム) や KL ダイバージェンスなどが用いられるようです(書籍内では二乗誤差)。最終的に、距離が 0 になるか、予め決めたイテレーション回数だけ更新を行ったら、分解が完了です。

NMF は比較的単純なアルゴリズムで多変量解析ができてしまう、というのでなかなか面白かったので言及してみました。書籍内ではニュース記事から作った文書 - 単語行列を使って記事推薦を実装したり、株式の取引量からある日付の出来事に関連する銘柄を引っ張りだしたりといった実例が載っています。時間があるときにでも、数学的な根拠や特性などについても調べてみたいところです。

集合知プログラミング

集合知プログラミング

参考文献, URL