2015-07-20 7 views
16

Я использую усеченный SVD от scikit-learn.Получить U, Sigma, V * матрицу из усеченного SVD в scikit-learn

В определении СВД, оригинальная матрица является approxmated как продукт UΣV *, где U и V имеют ортонормированные столбцы, а Σ является неотрицательным диагонали ,

Мне нужно, чтобы получить U, Σ и V * матрицы.

Глядя на исходный код here я узнал, что V * хранится в self.components_ поле после вызова fit_transform.

Возможно ли получить U и Σ Матрицы?

Мой код:

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_ 

ответ

27

Глядя на источник по ссылке вы предоставили, TruncatedSVD в основном оберткой sklearn.utils.extmath.randomized_svd; вы можете вручную вызвать это самостоятельно, как это:

from sklearn.utils.extmath import randomized_svd 

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

можно использовать scipy.sparse.svds (для плотных матриц можно использовать 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 

Если вы работаете с очень большими разреженными матрицами (возможно, ваша работа с естественным текстом), даже scipy.sparse.svds может взорвать ОЗУ вашего компьютера. В таких случаях рассмотрите пакет sparsesvd, который использует SVDLIBC, а также то, что gensim использует 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

Это верно, но для регулярного метода numpy.linalg.svd вы можете» t передайте количество компонентов в качестве параметра, чтобы вы сами извлекли верхний K. Незначительные неудобства. –

0

Предположит, X нашей входная матрицы, на которой мы хотим лет выполнить усеченные СВДА. Ниже команды помогает выяснить U, Sigma и 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 

Чтобы понять вышеуказанные термины, пожалуйста, обратитесь к http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html

+4

Я считаю, что этот ответ неверен: 'SVD.fit_transform (X) = U * np.diag (Sigma)! = U' и' SVD.explained_variance_ratio_ = np.var (X_transformed, axis = 0)/np.var (X, axis = 0) .sum()! = Sigma' – rth

+0

Этот ответ неверен, как упоминалось также rth. – JRun