PCA与SVD
PCA与SVD
背景
在许多研究工作中,需要对多个变量影响的数据进行分析,从大规模的数据中挖掘规律,很多情况下这些数据之间是相互关联的,增加问题分析的难度,如果孤立的对每个指标进行分析,往往会损失很多包含的信息,因此希望寻求一种方式可以减小问题分析的难度,并且保留更多的信息。一个直接的想法是,由于这些变量之间往往存在很多关系,如果可以通过某种方式将多个变量用尽可能少的新变量表示,新变量两两之间线性无关。主成分分析PCA是一种非常经典的降维方法。
PCA 原理
PCA是一种非常经典的降维方法,它的主要思想是将n维的特征映射到k维,这k维新的特征是在原来的n维基础之上构造出来的,是彼此正交的,也称作主成分。换个角度就是说寻找一组的正交坐标系,寻找的方法:第一个维度是寻找原来数据中方差最大的方向,第二个坐标轴是与第一个坐标轴正交方向上,方差最大的方向,第三个方向是与第一二轴构成平面垂直方向上方差最大的方向,以此类推,找到n个正交坐标系,发现后边找到的坐标轴方向上的方差接近为0,因此可以只保留方差较大的前k个坐标轴。
进而下面一个问题是怎么寻找方差最大的方向呢?
数学上可以计算数据矩阵的协方差矩阵,进而可以计算协方差矩阵的特征值和特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维,这里思考一个问题,为什么特征值最大的方向是方差最大的方向。
计算协方差矩阵:
Cov(X,Y)=E((X−E(X))(Y−E(Y)))=1n−1∑i=1n(xi−x‾)(y−(‾y))Cov(X,Y)=E((X-E(X))(Y-E(Y))) = \frac{1}{n-1}\sum_{i=1}^n(x_i-\overline{x})(y-\overline(y))Cov(X,Y)=E((X−E(X))(Y−E(Y)))=n−11i=1∑n(xi−x)(y−(y))
当协方差为正的时候,两个变量是正相关的,如果为小于零,两个变量是负相关的,Cov(X,X)Cov(X,X)Cov(X,X)计算的就是变量X的样本方差,当n>1n>1n>1时,协方差变成协方差矩阵。
散度矩阵:
s=∑i=1n(xk−x‾)(xk−x‾)Ts = \sum_{i=1}^n(x_k-\overline{x})(x_k-\overline{x})^Ts=i=1∑n(xk−x)(xk−x)T
数据X的散度矩阵就是XXTXX^TXXT,计算散度矩阵是在奇异值分解时的第一步。散度矩阵和下方差矩阵有着非常紧密的联系,散度矩阵等于协方差矩阵乘以(变量个数-1),也就是E((X−E(X))(X−E(X))T)E((X-E(X))(X-E(X))^T) E((X−E(X))(X−E(X))T)
计算协方差矩阵特征值和特征向量,可以使用特征值分解方法,也可以使用奇异值分解(SVD)
基于特征值分解:
矩阵的特征值和特征向量:Av=λvAv=\lambda vAv=λv, λ\lambdaλ是特征值,vvv是特征向量
特征值分解矩阵:
A=QΣQ−1A=Q\Sigma Q^{-1}A=QΣQ−1,其中QQQ是单位化的特征向量组成的矩阵,Σ\SigmaΣ是特征值按照大小顺序组成的对角矩阵
算法:
输入:X={x1,x2,...,xn}X = \{x_1,x_2,...,x_n\}X={x1,x2,...,xn}
输出:将X将维到k维
- 去中心化,每个数据减去平均值
- 计算协方差矩阵1nXXT\frac{1}{n}XX^Tn1XXT
- 求出协方差矩阵的特征值和特征向量,选择出特征值最大的前k个以及它们所对应的特征向量
- 这些特征向量按行组成特征向量矩阵PPP,PXPXPX即为降维后得到的数据。
注:基于特征值分解的方法只从行的角度对数据进行了压缩(左乘特征向量矩阵PPP)
基于奇异值分解:
奇异值分解在之前的文章中介绍过,SVD 是线性代数中对实数矩阵和复数矩阵的分解,这里只讲实数空间的情况,将特征分解从半正定矩阵推广到任意的m∗nm*nm∗n矩阵
对于一个矩阵Am∗nA_{m*n}Am∗n,SVD的目标是找到如下的分解方式:
Am∗n=Um∗mΣm∗nVn∗nTA_{m*n} = U_{m*m}\Sigma_{m*n}V_{n*n}^TAm∗n=Um∗mΣm∗nVn∗nT
UUU和VVV是正交矩阵,分别叫做矩阵AAA的左奇异矩阵和右奇异矩阵,Σ\SigmaΣ是一个非负的实对角矩阵,对角线元素叫做AAA的奇异值。
计算方法:
UUU的列是AATAA^TAAT的单位化过的特征向量构成
VVV的列是ATAA^TAATA的单位化过的特征向量构成
Σ\SigmaΣ的对角线元素是矩阵ATAA^TAATA的特征值的平方根,并且按照从大到小的顺序排列。
SVD的例子
A=(123400)
A=\begin{pmatrix}
1 & 2 \\
3 & 4 \\
0& 0
\end{pmatrix}
A=⎝⎛130240⎠⎞
计算AATAA^TAAT
AAT=(511011250000)
AA^T=\begin{pmatrix}
5& 11 &0 \\
11& 25 &0 \\
0& 0 &0 \\
\end{pmatrix}
AAT=⎝⎛511011250000⎠⎞
计算特征值 得到 29.86606875 , 0.13393125, 0
∣5−λ1101125−λ0000∣=0
\left| \begin{matrix}
5-\lambda & 11 &0 \\
11& 25-\lambda &0 \\
0& 0 &0 \\
\end{matrix}\right| = 0
∣∣∣∣∣∣5−λ1101125−λ0000∣∣∣∣∣∣=0
然后计算特征向量并进行单位化得到矩阵
(−0.40455358−0.91451430−0.91451430.404553580001)
\begin{pmatrix}
-0.40455358&-0.9145143 & 0 \\
-0.9145143 & 0.40455358 & 0 \\
0& 0 &1 \\
\end{pmatrix}
⎝⎛−0.40455358−0.91451430−0.91451430.404553580001⎠⎞
同理可以右奇异矩阵
(−0.57604844 −0.817415560.81741556−0.57604844)
\begin{pmatrix}
-0.57604844 & -0.81741556\\
0.81741556 & -0.57604844 \\
\end{pmatrix}
(−0.57604844 0.81741556−0.81741556−0.57604844)
算法
输入:X={x1,x2,...,xn}X = \{x_1,x_2,...,x_n\}X={x1,x2,...,xn}
输出:将X将维到k维
-
去平均值,即每一位特征减去各自的平均值。
-
计算XXTXX^TXXT和XTXX^TXXTX。
-
计算XXTXX^TXXT和XTXX^TXXTX的特征值与特征向量。
-
对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
-
将数据转换到k个特征向量构建的新空间中Uk∗mXm∗nVn∗kTU_{k*m}X_{m*n}V_{n*k}^TUk∗mXm∗nVn∗kT。
基于SVD的方法从行和列两个方向对矩阵进行了降维处理
参考:
https://blog.csdn.net/program_developer/article/details/80632779
- 降维方法PCA与SVD的联系与区别
- 主成份(PCA)与奇异值分解(SVD)的通俗解释
- PCA and SVD
- PCA本质和SVD
- PCA 和 SVD
- PCA,SVD
- svd的分解,pca,以及lsi
- SVD与PCA
- PCA与SVD的区别和联系
- PCA SVD LDA
- SVD理解和其在PCA,LSI的应用
- (5)PCA和SVD
- PCA和SVD区别和联系
- 【推荐系统】特征值分解(谱分解)和奇异值分解(SVD),即在PCA上的应用
- 机器学习笔记(11)-PCA/SVD
- PCA and SVD
- 为什么PCA中奇异值分解(SVD)和特征分解可以降低数据维度?
- 【转】SVD和PCA
- 关于PCA和SVD的认识
- Machine Learning in Action – PCA和SVD