2015-07-20 18 views
16

Sto utilizzando SVD troncato dal pacchetto scikit-learn.Ottieni U, Sigma, V * matrice da SVD troncato in scikit-learn

Nella definizione di SVD, una matrice originale Un è approxmated come prodotto Un diagonaleUΣV * dove U e V hanno colonne ortonormali e Σ è non negativo .

ho bisogno di ottenere il U, Σ e V * matrici.

Guardando il codice sorgente here ho scoperto che V * viene memorizzato in self.components_ campo dopo aver chiamato fit_transform.

E 'possibile ottenere U e Σ matrici?

Il mio codice:

import sklearn.decomposition as skd 
import numpy as np 

matrix = np.random.random((20,20)) 
trsvd = skd.TruncatedSVD(n_components=15) 
transformed = trsvd.fit_transform(matrix) 
VT = trsvd.components_ 

risposta

27

Guardando la sorgente tramite il link che hai fornito, TruncatedSVD è fondamentalmente un wrapper sklearn.utils.extmath.randomized_svd; è possibile chiamare manualmente da soli in questo modo:

from sklearn.utils.extmath import randomized_svd 

U, Sigma, VT = randomized_svd(X, 
           n_components=15, 
           n_iter=5, 
           random_state=None) 
8

Si può usare scipy.sparse.svds (per le matrici dense è possibile utilizzare svd).

import numpy as np 
from scipy.sparse.linalg import svds 

matrix = np.random.random((20, 20)) 
num_components = 2 
u, s, v = svds(matrix, k=num_components) 
X = u.dot(np.diag(s)) # output of TruncatedSVD 

Se si sta lavorando con molto grandi matrici sparse (forse il tuo lavoro con il testo naturale), anche scipy.sparse.svds potrebbe far saltare in aria la RAM del computer. In questi casi, prendere in considerazione il pacchetto sparsesvd che utilizza SVDLIBC e quello che gensim utilizza under-the-hood.

import numpy as np 
from sparsesvd import sparsesvd 


X = np.random.random((30, 30)) 
ut, s, vt = sparsesvd(X.tocsc(), k) 
projected = (X * ut.T)/s 
+2

Questo è vero, ma per il metodo numpy.linalg.svd regolare si puo' t passare il numero di componenti come parametro in modo da estrarre la parte superiore K da soli. Piccolo inconveniente –

0

supponiamo X è la nostra matrice di input su cui vogliamo yo eseguire troncato SVD. Di seguito i comandi aiuta a scoprire la U, Sigma e VT:

from sklearn.decomposition import TruncatedSVD 

    SVD = TruncatedSVD(n_components=r) 
    U = SVD.fit_transform(X) 
    Sigma = SVD.explained_variance_ratio_ 
    VT = SVD.components_ 
    #r corresponds to the rank of the matrix 

Per comprendere i termini di cui sopra, si prega di fare riferimento a http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html

+4

Credo che questa risposta non sia corretta: 'SVD.fit_transform (X) = U * np.diag (Sigma)! = U' e' SVD.explained_variance_ratio_ = np.var (X_transformed, axis = 0)/np.var (X, axis = 0) .sum()! = Sigma' – rth

+0

Questa risposta non è corretta, come indicato anche da rth. – JRun