非負値行列因子分解(NMF)

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

非負値行列因子分解

  • NMF = 非負値行列因子分解
  • 次元削減手法
  • NMF は解釈しやすい(PCA と異なる)
  • 解釈しやすい=説明しやすい
  • ただし、すべての特徴量は非負(>= 0)である必要
Pythonで学ぶ教師なし学習

解釈しやすい部分

  • NMF は文書をトピック(テーマ)の組合せで表現します

 

テキストボックス:DataCamp はデータサイエンス教育のリーダーであり… おおよそ 0.6 ×「program, r, python, function, method」+ 0.5 ×「data, analysis, cluster, statistics, mean」+ 0.7 ×「teaching, learn, lesson, lessons, course」の語を含むテキストボックス

Pythonで学ぶ教師なし学習

解釈しやすい部分

  • NMF は画像をパターンの組合せで表現します

 

3 本のストライプの箱 ≒ 0.98 × 1 本のストライプの箱 + 0.91 × 別のストライプの箱 + 0.95 × 別のストライプの箱

Pythonで学ぶ教師なし学習

scikit-learn の NMF の使い方

  • fit() / transform() パターンに従います
  • コンポーネント数を指定(例:NMF(n_components=2)
  • NumPy 配列と csr_matrix に対応
Pythonで学ぶ教師なし学習

語頻度配列の例

  • 語頻度配列(4 語、多数の文書)
  • 各文書での語の存在を「tf-idf」で測定
    • 「tf」=文書内での語の頻度
    • 「idf」=頻出語の影響を減らす

語頻度配列

Pythonで学ぶ教師なし学習

NMF の使用例

  • samples は語頻度配列です
from sklearn.decomposition import NMF

model = NMF(n_components=2)
model.fit(samples)
NMF(n_components=2)
nmf_features = model.transform(samples)
Pythonで学ぶ教師なし学習

NMF のコンポーネント

  • NMF にはコンポーネントがあります
  • …PCA に主成分があるのと同様です
  • コンポーネントの次元=サンプルの次元
  • 要素は非負
print(model.components_)
[[ 0.01  0.    2.13  0.54]
 [ 0.99  1.47  0.    0.5 ]]
Pythonで学ぶ教師なし学習

NMF の特徴量

  • NMF の特徴量は非負
  • サンプルを再構成できます
  • …特徴量とコンポーネントを組み合わせます
print(nmf_features)
[[ 0.    0.2 ]
 [ 0.19  0.  ]
  ...
 [ 0.15  0.12]]
Pythonで学ぶ教師なし学習

サンプルの再構成

print(samples[i,:])
[ 0.12  0.18  0.32  0.14]
print(nmf_features[i,:])
[ 0.15  0.12]

特徴量で重み付けした NMF コンポーネントの和

Pythonで学ぶ教師なし学習

サンプル再構成

  • コンポーネントに特徴量を掛けて足し合わせます
  • 行列の積として表せます
  • これが「NMF」の「行列因子分解」です
Pythonで学ぶ教師なし学習

NMF は非負データのみに適合

  • 各文書の語頻度
  • 配列として符号化した画像
  • 音声スペクトログラム
  • EC サイトの購買履歴
  • ほか多数
Pythonで学ぶ教師なし学習

Passons à la pratique !

Pythonで学ぶ教師なし学習

Preparing Video For Download...