Sklearn中的非负矩阵分解

7 投票
1 回答
6980 浏览
提问于 2025-04-18 13:15

我正在对一个很大的矩阵使用非负矩阵分解(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_;

撰写回答