PCA主成分分析数学原理
Welcome To My Blog
复习完线性代数再来推导下PCA
概述
- 主成分分析(principalcomponent analysis)是一种数据分析方法,
出发点:从一组特征中计算出一组按重要性从大到小排列的新特征,它们是原有特征的线性组合,并且相互之间是不相关(即不线性相关)的.- 重要性:通过方差衡量,方差大说明数据分布很散,含有的信息量大
- 不相关:推导时用
具体推导
参数说明
记x1,x2...xp是P个原始特征(也就是某个样本的维数), x=(x1,x2...xp)^t,记ξ1,ξ2...ξp是p个新特征, ξ=(ξ1,ξ2...ξp)^t
新特征是原始特征的线性组合,ξi =Σαij*xj =αi^t*x 或者 ξ =A^t*x
A=(α1,α2...αp). αi=(αi1,αi2...αip)^t.
αi是新特征ξi线性组合的系数,不妨使||α||=1,即αi^t*αi=1(由具体推导过程可知,这是结果的共有部分,所以可以设为1),
ξi=αit*x的结果是一个数,所以对αit*x进行转置不影响结果)
计算第一个新特征ξ1的方差:
Var(ξ1)
= E[ξ1*ξ1^t] -E[ξ1]E[ξ1^t]
= E[α1t*x*xt*α1]-E[α1^t*x ]E[x^t*α1]
= α1^t *{E[x^t*x] -E[x]E[x^t]}α1
= α1^t*Σ*α1
Σ是x的协方差矩阵,接下来在αi^t*αi=1的约束条件下求Var的极值,使用拉格朗日乘子法:
f(α1,ν)= α1^t *Σ*α1-ν(α1^t *α1-1)
关于α1求偏导并使结果等于零,可得:Σ*α1 = ν*α1 (显而易见,ν是Σ的特征值,α1是Σ对应ν的特征向量)
代回得,Var(ξ1) = ν*α1^t*α1 = ν,说明方差的最大值就是x的协方差矩阵的特征值,取ν为最大的特征值,使新特征ξ1最重要
计算第二个新特征ξ2的方差:
Var(ξ2) = α2^t*Σ*α2
保持ξ1与ξ2不相关,即加入约束Cov(ξ1,ξ2)= 0
Cov(ξ1,ξ2)
= E[ξ1*ξ2^t] - E[ξ1]E[ξ2^t]
= α1^t* {E[x^t*x] -E[x]E[x^t] }*α2^t
= α1^t*Σ*α2
为利用第一个新特征的条件,求Cov(ξ2,ξ1)
Cov(ξ2,ξ1) = Cov(ξ1,ξ2)
= α2^t*Σ*α1
= ν*α2^t*α1 (因为Σ*α1 = ν*α1)
= 0
得 α2^t *α1 = 0,说明α1与α2正交,也就是说,此处不相关等价于α1与α2正交
在α2^t *α2=1和α2^t*α1 =0的约束下用拉格朗日乘子法求Var(ξ2)的最大值
f(α2,α1,m,n) = α2^t*Σ*α2 - m(α2^t*α2-1) - n*α2^t*α1
分别对α2,α1,m,n求偏导并使结果为0,得n=0, Σ*α2 = m*α2 (显而易见,m是Σ的特征值,α2是Σ对应m的特征向量)
代回得,Var(ξ2) = m
计算其余新特征ξ的方差
同理,求出ξ3,ξ4...ξp
进一步总结
- 可以发现,每个新特征ξi的方差都是x协方差矩阵Σ的特征值,所以有了这个理论基础后可以直接求Σ的特征值,并从大到小排序,依次作为ξi方差的最大值
- Σ是实对称矩阵,所以Σ一定正交相似于对角矩阵,且对角矩阵的对角元素就是Σ的特征值,只需找出正交矩阵O,使O^(-1)ΣO=diag(λ1,λ2...λp)即可
- Σ是实对称矩阵,所以Σ对应不同特征值的特征向量都是正交的,求出特征向量再对特征向量进行单位化,各个特征向量即可组成一个符合条件的正交矩阵
- 不仅如此,我们发现,计算过程中各个组合系数αi是正交的,且长度为1,所以直接用通过Σ得到的正交矩阵的各个列向量作为αi即可!所以组合系数来的很方便,但要注意对照特征值进行排序
- 这样一来,新旧特征之间的具体关系ξ=A^t*x就明确了,实际中通常把主成分进行零均值化,即 ξ = A^t*(x-μ),这样协方差矩阵更容易计算,且不影响主成分的方向
- 每个ξi都是一个主成分,全部主成分的方差之和等于x协方差矩阵特征值的和,即 ΣVar(ξi) = Σλi,也就是x协方差矩阵的迹(trace)
如何降维?
- 通常希望用较少的主成分ξi来表示数据,前k个主成分的方差和Σλi比上所有主成分的方差和可以得到这k个主成分所占的比例,根据实际需求,比如80%,算出k的个数
- 降维:
- 把p维的数据减少成k维的数据(k<p),也就是用ξ的前k个维度(ξ1,ξ2...ξk)^t 描述每个样本
- 换句话说,原来的坐标轴是(x1,x2...xp)^t ,降维后的坐标轴是(ξ1,ξ2...ξk)^t.
- 给个具体的例子,p*m维矩阵C,由m个样本构成,每个样本是p维,使用A的前k个主成分进行降维,A^t*C,即可得到降维后的数据