我正在对一个大型矩阵应用非负矩阵分解(NMF)。NMF方法的基本操作如下:给定一个m行n列的矩阵A,NMF将其分解为A = WH,其中W是m行d列的矩阵,H是d行n列的矩阵。Python包Sklearn中实现了ProjectedGradientNMF方法。我希望算法能同时返回W和H。但似乎它只返回H,而不返回W。对A的转置矩阵A.T再次应用该算法可以得到W。然而,由于矩阵非常大,我希望避免进行两次计算。
如果你能告诉我如何同时获得W和H,那就太好了!以下是我的代码:
from sklearn.decomposition import ProjectedGradientNMFimport numpyA = 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
回答:
幸运的是,你可以查看源代码:
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_;