在scikit-learn中从截断的SVD获取U,Sigma,V *矩阵

时间:2015-07-20 18:18:17

标签: python scipy scikit-learn sparse-matrix svd

我正在使用scikit-learn包中的截断SVD。

在SVD的定义中,原始矩阵 A 近似为产品 A UΣV* 其中 U V 有正交列,Σ是非负对角线。

我需要获得 U Σ V * 矩阵。

查看源代码here我发现在调用self.components_ V * 存储在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_

6 个答案:

答案 0 :(得分:35)

通过您提供的链接查看源代码,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)

答案 1 :(得分:9)

可以使用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也可能会炸毁您计算机的内存。在这种情况下,请考虑使用sparsesvdSVDLIBC包以及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 :(得分:1)

请注意:

svd.transform(X)

svd.fit_transform(X)

生成 U *西格玛

svd.singular_values_

以矢量形式生成 Sigma

svd.components_

生成 VT 。 也许我们可以使用

svd.transform(X).dot(np.linalg.inv(np.diag(svd.singular_values_)))

获得 U ,因为 U *西格玛*西格玛^ -1 = U * I = U

答案 3 :(得分:1)

我知道这是一个较旧的问题,但正确的版本是-

U = svd.fit_transform(X)
Sigma = svd.singular_values_
VT = svd.components_

但是,要记住的一件事是U和VT被截断,因此如果没有其余值,就无法重新创建X。

答案 4 :(得分:0)

从源代码中,我们可以看到返回了X_transformed的{​​{1}}(这里U * Sigma是向量) 从Sigma方法开始。这样我们就可以得到

fit_transform

备注

截断的SVD是一个近似值。 X≈X'=UΣV*。我们有X'V =UΣ。但是XV呢?一个有趣的事实是XV = X'V。这可以通过比较X的完整SVD形式和X'的截短的SVD形式来证明。注意XV只是svd = TruncatedSVD(k) X_transformed = svd.fit_transform(X) U = X_transformed / svd.singular_values_ Sigma_matrix = np.diag(svd.singular_values_) VT = svd.components_ ,所以我们也可以通过{p>

transform(X)

答案 5 :(得分:-2)

让我们假设X是我们想要执行Truncated SVD的输入矩阵。 以下命令有助于找出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