如何使用 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-learn
和numpy
包中获取全部三个矩阵?
我想我可以通过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
中的对角线条目。 U
和 V
是分解后的对应矩阵。
顺便说一句,请注意,当您使用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 PCA与SVD 之 PCA中的SVD
机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD