从scikit learn中截短SVD得到U,Sigma,V*矩阵

2024-06-03 16:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在SVD的定义中,原矩阵A被近似为乘积AU∑V*,其中UV具有正交列,是非负对角线。

我需要得到矩阵。

查看源代码here,我发现调用fit_transform后,V*存储在self.components_字段中。

有可能得到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_

Tags: import定义asnpcomponentstransform矩阵random
3条回答

可以使用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也可能会炸掉你计算机的RAM。在这种情况下,考虑使用SVDLIBCsparsesvd包,以及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

作为一个注释:

svd.transform(X)

以及

svd.fit_transform(X)

生成U*Sigma

svd.singular_values_

以矢量形式生成西格玛

svd.components_

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

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

因为U*Sigma*Sigma^-1=U*I=U

通过您提供的链接查看源代码,TruncatedSVD基本上是sklearn.utils.extmath.randograted的包装;您可以自己手动调用它,如下所示:

from sklearn.utils.extmath import randomized_svd

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

相关问题 更多 >