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便利。