Неотрицательная матричная факторизация в Sklearn

Я применяю неотрицательную матричную факторизацию (NMF) на большой матрице. По существу, метод NMF делает следующее: Учитывая матрицу M по n, NMF разлагается на A = WH, где W-m по d и H-d по n. Метод ProjectedGradientNMF реализован в пакете Python Sklearn. Я хотел бы, чтобы алгоритм возвращал как W, так и H. Но кажется, что он возвращает только H, а не W. применение алгоритма снова к A. T (транспонирование) может дать мне W. однако я хотел бы избежать его вычисления дважды со времен матрицы ix очень большой.

Если бы вы могли сказать мне, как одновременно получить 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 ответов


К счастью, вы можете посмотреть через источник code:
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;

to

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