2014-07-14 14 views
6

我在非常大的矩阵上应用非负矩阵分解(NMF)。实质上,NMF方法执行以下操作:给定m乘n矩阵A,NMF分解为A = WH,其中W是m乘以d,H是d乘n。 ProjectedGradientNMF方法在Python包Sklearn中实现。我想要算法返回W和H.但它似乎只返回H,而不是W.再次应用该算法到AT(转置)可以给我W.但是,我想避免计算两次,因为矩阵ix非常大。Sklearn中的非负矩阵因式分解

如果你能告诉我如何同时得到W和H,那太棒了!下面是我的代码:

from sklearn.decomposition import ProjectedGradientNMF 
import numpy 
A = numpy.random.uniform(size = [40, 30]) 
nmf_model = ProjectedGradientNMF(n_components = 5, init='random', random_state=0) 
nmf_model.fit(A) 
H = nmf_model.components_.T 
+0

能否再次应用该算法A.T(转置)真的给W'我无法验证它。 – svural

回答

18

幸运的是,你可以看看通过源代码:
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/decomposition/nmf.py

fit_transform()始于线460,并在线路530这表明H被连接到components_,并返回W从功能。

所以,你不应该有两次运行这个,你应该只改变:

nmf_model.fit(A); 
H = nmf_model.components_.T; 

W = nmf_model.fit_transform(A); 
H = nmf_model.components_; 
+4

太好了。我认为sklearn应该清楚地指出这一点。它过分关注特征提取。 –