PythonでNMFをしたい

スコアがついたアイテム✖️ユーザーのデータをもとにレコメンドをしたい場合、特異値分解を用いることがあります。

特に非負かつ、スパースなデータの場合、NMFはその情報を強く残すため有用と言われています。

コード

import numpy as np
from sklearn.decomposition import NMF


X = np.array([[0, 1,4], [2, 4,0], [3, 3,1], [4, 1,4], [5, 0,4], [0, 1,3]])

#nmfをかけてW,Hを取得
nmf = NMF(n_components=2, init='random', random_state=0)
W = nmf.fit_transform(X)
H = nmf.components_


#値を取得するときはdot
np.dot(W,H)

レコメンドで使う場合

縦軸をユーザー単位、横軸をアイテム単位と考えた場合、Wがアイテム x components,Hがcomponents x ユーザー。

これをnp.dotで計算することで好む度合いがだせる。ただし、これは未知のデータへの適用を考えていない。