首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sklearn.decomposition.PCA.fit_transform(X)不乘X?

为什么sklearn.decomposition.PCA.fit_transform(X)不乘X?
EN

Stack Overflow用户
提问于 2017-11-24 15:25:32
回答 1查看 523关注 0票数 0

据我所知,常设仲裁法院一般采取以下步骤:

  1. 计算协方差矩阵Σ= (1/m) * (X*X')
  2. Σ: U,S,V= SVD(Σ)上的奇异值分解
  3. 取U的第一列k降为k维: U_reduced = U:,k
  4. X_reduced = U_reduced‘*X

X_reduced是X降为k维。

但是,当我查看SKLearn的实现时,我发现了这一行代码:

代码语言:javascript
复制
U *= S[:self.n_components_]

这个U作为转换X返回,为什么使用S而不是X仍然有效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-24 16:25:53

你对1-2的理解是不正确的。主成分分析既可以通过寻找协方差矩阵的特征向量来实现,也可以通过将奇异值分解应用于中心数据矩阵来实现。你不能同时做协方差和SVD。在实践中,SVD方法是可取的,因为协方差矩阵的计算放大了与条件差的矩阵相关的数值问题。SKLearn使用它;下面是方法的核心

代码语言:javascript
复制
self.mean_ = np.mean(X, axis=0)
X -= self.mean_
U, S, V = linalg.svd(X, full_matrices=False)

SVD将X表示为U @ S @ V.T (使用@表示矩阵乘法,并假定实值数据)。这里V由协方差矩阵的特征向量组成,并且满足正交关系V.T @ V = I

就特征向量V而言,变换后的数据为X @ V。但是,由于X等于U @ S @ V.T,所以把两边乘以V,就会导致X @ V等于U @ S。因此,U @ S是转换后的数据。

用对角的S相乘比用X相乘容易,X是任意的稠密矩阵。

有关更多信息,请参见SVD与PCA的关系。如何利用SVD进行PCA?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47476209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档