如何使用 sklearn 获得所有三个 SVD 矩阵?

Posted

技术标签:

【中文标题】如何使用 sklearn 获得所有三个 SVD 矩阵?【英文标题】:How to get all three SVD matrices with sklearn? 【发布时间】:2018-02-02 12:57:40 【问题描述】:

矩阵M的Singular value decomposition(M,N)表示因式分解

如何从scikit-learnnumpy包中获取全部三个矩阵?

我想我可以通过PCA model获得Sigma

import numpy as np
from sklearn.decomposition import PCA

model = PCA(N, copy=True, random_state=0)
model.fit(X)

Sigma = model.singular_values_
Sigma = np.diag(singular_values)

其他矩阵呢?

【问题讨论】:

【参考方案1】:

您可以使用numpy.linalg.svd 获取这些矩阵,如下所示:

a=np.array([[1,2,3],[4,5,6],[7,8,9]])
U, S, V = np.linalg.svd(a, full_matrices=True)

S 是一个1D 数组,表示Sigma 中的对角线条目。 UV 是分解后的对应矩阵。

顺便说一句,请注意,当您使用PCA 时,数据在应用svd 之前居中(与numpy.linalg.svd 不同,其中svd 直接应用于矩阵本身。参见第409-410 行here)。

【讨论】:

当数据有噪声时,这是否等同于 PCA? np.linalg.svd 不能在 PCA 估计器仍然运行时抛出异常吗? 我不明白为什么它应该是等效的。 GitHub 中的 PCA 代码也使用 numpy.linalg.svd (这显示在我在答案中提供的链接中)。唯一的区别是在 PCA 代码中他们使用 full_matrices=False 并且在分解之前将数据居中,但它仍然是相同的函数。【参考方案2】:

无法评论 Mirian 的答案,因为我没有足够的声誉,但从 Miriam 的链接来看,sklearn 实际上调用了 scipy 的 linalg.svd,这似乎与 np.linalg.svd @ 不一样987654321@

所以使用U, S, V = scipy.linalg.svd(a, full_matrices=True)可能会更好

【讨论】:

以上是关于如何使用 sklearn 获得所有三个 SVD 矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的降维算法PCA和SVD

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

如何使用矩格式获取时区

机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD 附录

机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD 附录