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

新手上路,请多包涵

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

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

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

这里查看 源代码,我发现 V* 在调用 fit_transform 后存储在 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_

原文由 Vektor88 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 952
2 个回答

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

原文由 maxymoo 发布,翻译遵循 CC BY-SA 3.0 许可协议

可以使用 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 也可能会耗尽您计算机的内存。在这种情况下,请考虑使用 SVDLIBCsparsesvd 包,以及 gensim 底层使用的内容。

 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

原文由 Vektor88 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题