scikit-learnで非負値行列因子分解(NMF)

- http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html

を見たりググった日本語での検索結果でも何がどうなってるのかよくわからんので、ちゃんと試したメモ。

非負値行列因子分解自体は要するに、ある行列MをM≒WHと近似した時に、その近似後の行列W、Hの要素が全部正になるようにしてるってだけ。
これをPythonでやるにはこうする。
分解後の行列を取得するインターフェイスが揃ってないのが謎だ…

import numpy as np
from sklearn.decomposition import NMF
# 適当なサンプル行列
X = np.array([[1,2,3], [4,5,6],[7,8,9], [10,11,12]])
# NMFの実行&W・Hの取得
model = NMF(n_components=2, init='random', random_state=0)
W = model.fit_transform(X);
H = model.components_;


分解後&M再構成後の結果表示(Rodeo)
だいたい元の行列Mを再現できてる。

>>> W
array([[ 0.        ,  0.62704037],
       [ 0.97579534,  0.86418623],
       [ 2.16991747,  0.97041386],
       [ 3.37527535,  1.06990405]])
>>> H
array([[ 2.3891489 ,  2.23274522,  2.07634154],
       [ 1.8294132 ,  3.24200677,  4.65460034]])
>>> np.dot(W, H)
array([[  1.14711593,   2.03286912,   2.91862231],
       [  3.91227405,   4.98039998,   6.04852592],
       [  6.95954385,   7.99096116,   9.02237846],
       [ 10.02133195,  11.00476605,  11.98820016]])