2015-07-20 15 views
16

scikit-learn paketinden kesilmiş SVD kullanıyorum. SVD tanımındaSaptırılmış SVD'den U, Sigma, V * matrisini scikit-öğrenin.

, bir bir ürün olarak approxmated bir orijinal matris birUΣV * U ve V ortonormal sütun var ve Σ olan negatif olmayan köşegen .

Ben U, Σve V * matrisleri almak gerekir.

Ben V *fit_transform çağrıldıktan sonra self.components_ alanında depolanan öğrendim kaynak kodu here bakarak.

o U ve Σ matrisleri elde etmek mümkün mü?

Kodum:

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_ 

cevap

27

, TruncatedSVD temelde sklearn.utils.extmath.randomized_svd etrafında sarıcı; el böyle bu kendinizi arayabilirsiniz:

from sklearn.utils.extmath import randomized_svd 

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

Bir scipy.sparse.svds (yoğun matrisler için size svd kullanabilirsiniz) kullanabilirsiniz. Eğer (belki senin doğal metinle çalışma) gerçekten büyük seyrek matrisler ile çalışıyorsanız

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 

, hatta scipy.sparse.svds bilgisayarınızın RAM havaya uçurabilir. Bu gibi durumlarda, SVDLIBC'u kullanan sparsesvd paketini ve gensim'un under-the-hood'u kullanın. Eğer verilen bağlantı üzerinden kaynağına bakıldığında

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

bu durum geçerlidir bakınız ancak düzenli numpy.linalg.svd yöntemi için sen': komutları Aşağıda U, Sigma ve VT öğrenmek için yardımcı olur t bileşen sayısını parametre olarak aktarın, böylece üst K'yi kendiniz çıkarmalısınız. Küçük rahatsızlık. –

0

bize X'in biz yo Kesik SVD gerçekleştirmek istediğiniz bizim giriş matristir varsayalım.

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 

yukarıdaki şartları anlamak için http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html

+4

Bu cevabın doğru olmadığına inanıyorum: 'SVD.fit_transform (X) = U * np.diag (Sigma)! = U' ve' SVD.explained_variance_ratio_ = np.var (X_transformed, axis = 0)/np.var (X, eksen = 0) .sum()! = Sigma' – rth

+0

Bu cevap, rth tarafından da belirtildiği gibi doğru değildir. – JRun