什么是PCA?
PCA(principal component analysis),也就是主成分分析,是一种算法,主要用来数据降维。
PCA是将原始的样本矩阵X转换成降维后的新样本Y的一种方法。
为了实现维度变化我们需要一个
变换矩阵U,Yr×n=UTr×mXm×n(这里是先转置,再取前n行),用于对行进行压缩
或者矩阵V,Ym×r=Xm×nVn×r,用于对列进行压缩。
一般不会对样本数量降维,都是对样本的特征数量降维,也就是用少量的特征数量去表征样本的特征,这样就实现了数据降维。
怎么计算PCA?
PCA计算一般有两种常用的方法,分别是特征值分解法和奇异值分解法。
特征值分解:
推导:
PCA是要求降维后的数据Y的方差最大,并且基向量之间正交。
数据的方差计算公式:
n−11i=1∑n(UiTXi−UiTμ)2=n−11i=1∑nUiT⋅X′X′T⋅Ui
其中的S=X′X′T就是为X′的协方差矩阵,而μ表示样本的平均值。
注意其中U是正交矩阵,也就是UTU=I,并且协方差矩阵的特征值和特征向量满足:SUi=λUi,也就是UiTSUi = λi,代入上面式子,方差计算最后的结果就是n−11i=1∑nλi。
所以,选择特征值越大的特征向量,越能代表数据的原始特征。
计算步骤(并不是代码,简单表明一下计算步骤):
- 样本均值化:X′=X−μ
- 计算协方差矩阵:S=X′X′T或者S′=X′TX
- 计算协方差矩阵的特征值和特征向量:λ,V=eig(S′)或者 λ,U=eig(S)
- 最后计算降维后的数据:Ym×r=Xm×nVn×r或者Yr×n=UTr×mXm×n
奇异值分解,SVD,Singular value decomposition
为什么要用奇异值分解?
从上面可以看出来,特征值分解的方法计算比较耗费时间。
而SVD分解的方法在计算U和V时有些情况下会更快。因此SVD可以实现PCA。
奇异值分解原理:
其实奇异值分解的原始计算方法还是利用特征值分解,具体方法如下:
- 首先一个矩阵可以分解成这种形式:Xm×n=Um×mΣm×nVn×nT(证明略)
- 其协方差矩阵就是XX′=UΣ1VTVΣ1TUT=UΣ1Σ1TUT=UΣUT,这里加了下标的就是前面的那个$\Sigma $矩阵,没加下标的矩阵是另一个矩阵,以示区别。
- 所以U就是协方差矩阵S的特征向量构成的矩阵,当然V也是S′的特征向量构成的矩阵
- 对S和S′进行特征值分解就可以得到U和V。
- Σ 是一个对角矩阵,主对角元素是奇异值,一般从大到小排列,我们只需要用得到的特征值这样 σi=λi 就可以得到奇异值矩阵 Σ
奇异值分解与特征值分解
- 奇异值分解和特征值分解均是为了得到变换矩阵U或V。
- 实际计算时,一些框架如numpy会有特殊的算法来计算奇异值分解,速度会更快,所以使用SVD可以提高PCA的步骤。
奇异值分解计算PCA的步骤
- X=UΣVT(先对X做均值化操作)
- Ym×r=Xm×nVn×r 或者 Yr×n=UTr×mXm×n
小记
花了一晚上来写,主要是公式有点多,写的也不是很熟练。我也是网上查别人的博客结合个人理解总结的,如有不对请指正。