2014-07-14 7 views
6

Stosuję nieujemną macierzarię macierzy (NMF) na dużej macierzy. Zasadniczo metoda NMF wykonuje następujące czynności: biorąc pod uwagę m-n macierzy A, NMF rozkłada się do A = WH, gdzie W jest m przez d, a H - przez n. Metoda ProjectedGradientNMF jest zaimplementowana w pakiecie Pleqona Sklearn. Chciałbym, aby algorytm zwrócił zarówno W, jak i H. Ale wydaje się, że zwraca tylko H, a nie W. Zastosowanie algorytmu ponownie do AT (transpozycja) może dać mi W. Jednak chciałbym uniknąć obliczenia go dwa razy, ponieważ matrix ix bardzo duży.Nieujemna faktoryzacja macierzy w Sklearn

Jeśli mógłbyś mi powiedzieć, jak uzyskać jednocześnie W i H, byłoby wspaniale! Poniżej jest mój kod:

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

Could stosowania algorytmu ponownie A.T (transpozycję) naprawdę dać W.? Nie jestem w stanie tego zweryfikować. – svural

Odpowiedz

18

szczęście można przejrzeć kod źródłowy:
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/decomposition/nmf.py

fit_transform() zaczyna się na linii 460, a na linii 530 pokazuje, że H zostanie dołączony do components_ i W jest zwracana z funkcji.

Więc nie powinno się uruchomić to dwukrotnie, należy po prostu zmienić:

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

do

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

Świetnie. Myślę, że sklearn powinien wyraźnie to wskazać. Skupia się zbytnio na wyodrębnianiu funkcji. –