我正在使用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_
通过您提供的链接查看源代码,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)
可以使用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
我知道这是一个较旧的问题,但正确的版本是 -
U = svd.fit_transform(X)
Sigma = svd.singular_values_
VT = svd.components_
但是,要记住的一件事是U和VT被截断,因此没有剩下的值就不可能重新创建X.
就像一张纸条:
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.
从源代码中,我们可以看到X_transformed
是U * 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_
让我们假设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