您的位置:首页 > 其它

PCA与SVD

2019-03-16 16:17 169 查看

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−11​i=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维

  1. 去中心化,每个数据减去平均值
  2. 计算协方差矩阵1nXXT\frac{1}{n}XX^Tn1​XXT
  3. 求出协方差矩阵的特征值和特征向量,选择出特征值最大的前k个以及它们所对应的特征向量
  4. 这些特征向量按行组成特征向量矩阵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∗n​Vn∗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=⎝⎛​130​240​⎠⎞​
计算AATAA^TAAT
AAT=(511011250000) AA^T=\begin{pmatrix} 5& 11 &0 \\ 11& 25 &0 \\ 0& 0 &0 \\ \end{pmatrix} AAT=⎝⎛​5110​11250​000​⎠⎞​
计算特征值 得到 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−λ110​1125−λ0​000​∣∣∣∣∣∣​=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.404553580​001​⎠⎞​
同理可以右奇异矩阵
(−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维

  1. 去平均值,即每一位特征减去各自的平均值。

  2. 计算XXTXX^TXXT和XTXX^TXXTX。

  3. 计算XXTXX^TXXT和XTXX^TXXTX的特征值与特征向量。

  4. 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

  5. 将数据转换到k个特征向量构建的新空间中Uk∗mXm∗nVn∗kTU_{k*m}X_{m*n}V_{n*k}^TUk∗m​Xm∗n​Vn∗kT​。

基于SVD的方法从行和列两个方向对矩阵进行了降维处理

参考:
https://blog.csdn.net/program_developer/article/details/80632779

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: