Pythonでscikit-learnを使ってNon-negative Matrix Factorization

Non-negative Matrix Factorization(NMFでググるといろいろ出てきます)、非負値行列因子分解です。

集合知プログラミング でも紹介されている特徴を抽出する方法です。推薦エンジンとかにも使われているそうです。

書籍では自前で実装されてますがscikit-learnに同じものがあるので便利に利用させていただきます。

import numpy as np
from sklearn.decomposition import ProjectedGradientNMF


def main():

    X = np.array([
        [1, 0, 0],
        [1, 1, 0],
        [0, 1, 0],
        [0, 1, 0],
        [0, 0, 1],
    ])

    model = ProjectedGradientNMF(init='nndsvdar')
    _res = model.fit_transform(X)
    print(_res)

if __name__ == "__main__":
    main()

実行するとこんな感じで出力されます。

$ python nfm.py
[[ -0.00000000e+00   9.15822497e-01  -0.00000000e+00]
 [  6.85467400e-01   9.15816894e-01  -0.00000000e+00]
 [  6.85636205e-01   2.24117374e-09  -0.00000000e+00]
 [  6.85636205e-01   2.24116561e-09  -0.00000000e+00]
 [ -0.00000000e+00  -0.00000000e+00   9.99944486e-01]]

素晴らしい。

サンプルデータをちゃんと投入すればもうちょっとまともな値がでてきます。パラメータの与え方はちゃんと検証して調整しないとです。

動かした環境はPython3.4で、

$ pip freeze
numpy==1.9.2
scikit-learn==0.16.1
scipy==0.15.1

Python便利。