我正在使用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_
答案 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
也可能会炸毁您计算机的内存。在这种情况下,请考虑使用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 :(得分: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