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

问题描述 投票:23回答:6

我正在使用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_
python scipy scikit-learn sparse-matrix svd
6个回答
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)

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
投票

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

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

但是,要记住的一件事是U和VT被截断,因此没有剩下的值就不可能重新创建X.


1
投票

就像一张纸条:

svd.transform(X)

svd.fit_transform(X)

生成U * Sigma。

svd.singular_values_

以矢量形式生成Sigma。

svd.components_

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

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

获得U因为U * Sigma * Sigma ^ -1 = U * I = U.


0
投票

从源代码中,我们可以看到X_transformedU * Sigma(这里Sigma是一个向量)是从fit_transform方法返回的。所以我们可以得到

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_

备注

截断的SVD是近似值。 X≈X'=UΣV*。我们有X'V =UΣ。但是XV怎么样?一个有趣的事实是XV = X'V。这可以通过比较X的完整SVD形式和X'的截断SVD形式来证明。注意XV只是transform(X),所以我们也可以得到U

U = svd.transform(X) / svd.singular_values_

-3
投票

让我们假设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

© www.soinside.com 2019 - 2024. All rights reserved.