Sklearn中的非负矩阵分解
我正在对一个很大的矩阵使用非负矩阵分解(NMF)的方法。简单来说,NMF的工作原理是这样的:给定一个m行n列的矩阵A,NMF会把它分解成A = WH,其中W是m行d列的矩阵,H是d行n列的矩阵。ProjectedGradientNMF这个方法是在Python的Sklearn库中实现的。我希望这个算法能同时返回W和H,但似乎它只返回了H,而没有返回W。如果我对A的转置(A.T)再运行一次这个算法,就能得到W。但是,由于这个矩阵非常大,我不想重复计算。
如果你能告诉我怎么同时得到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
1 个回答
19
幸运的是,你可以查看源代码:
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_;