协方差矩阵与PCA+Matlab

协方差矩阵与特征值及其特征向量

最近在利用协方差矩阵计算些东西,对结果有点混乱,所以打算整理一下这方面的东西。

 

一 协方差矩阵

首先,关于协方差矩阵的公式都见得到这里就不摆了。

理解协方差矩阵是:

  1. 协方差矩阵相对于协方差是能处理多维问题
  2. 输入协方差矩阵中的数据:行表示样本,列表示维度
  3. 协方差矩阵是一个对称矩阵,无论输入的数据mxn中样本数m多大,最终得到的都是nxn的方阵
  4. 协方差矩阵度量的是维度与维度之间的关系,所以协方差计算的是不同维度之间的协方差
  5. 协方差矩阵计算时是按列进行计算均值的;协方差矩阵对角线上的元素是各个维度的方差,其他元素是两两维度间的协方差(相关性)

 

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -

二 协方差矩阵与PCA

主成分分析(Principal Component Analysis,简称PCA),简单来说就是一个通用的降维工具。

      PCA是找出最能够代表原始数据的投影方法,即降维后的数据不能失真,降掉的那些噪声或是冗余的维度数据,把高维的数据通过线性变换投影到低维空间上去。

    而PCA实现的关键就是通过协方差矩阵。参考前面描述的协方差矩阵,要降掉的是相关性很小的(噪声)维度,协方差矩阵提供了这一数据,即把协方差矩阵非对角线上的元素趋近于零,通过矩阵对角化实现。

   对角化后得到的矩阵,其对角线上是协方差矩阵的特征值:各个维度新方差;对角化后剩余维度之间的相关性已经减弱,完成去噪。

   去除冗余,对于得到的对角化后的新方差矩阵只取那些含有较大方差(特征值)的维度,其余的舍掉即可。

   所以,PCA的本质其实就是对角化协方差矩阵

   结合协方差矩阵进行主成分分析大致流程:

  •  得到样本矩阵,样本矩阵中心化
  •  计算样本矩阵的协方差矩阵
  •  对协方差矩阵进行特征值分解,选取p个特征值对应的特征向量组成投影矩阵
  •  对原始样本矩阵进行投影,得到降维后的新样本矩阵

注 :PCA实现:协方差矩阵的特征值分解cov()与奇异值分解svd()。(后面阐述) 

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

三 MATLAB实现

(假设原始样本矩阵是mxn,随机产生m = 20,n = 3)

S = fix (rand(20,3)*20))

计算协方差矩阵:

S = S - repmat(mean(S),20,1)    %中心化样本矩阵      or      C = cov(S)   %得到协方差矩阵

C = (S*S)./(size(S,1)-1)    %得到协方差矩阵

对协方差矩阵进行特征值分解:

[V D] = eig(C)

注:这里的维度为三维,所以全保留。且eig()函数得到的结果是升序排列的

        D是PCA后的样本协方差矩阵(非对角线元素为0,对角线上为特征值)

        V是降噪后的协方差矩阵的特征值升序排列的投影矩阵

PCA降维后的新样本矩阵:

S1 = S*V

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

注:MATLAB自带了主成分分析函数princomp()

[coeff,score] = princomp(S) 

coeff 表示投影矩阵

score 表示投影后的新样本矩阵

但,score得到的结果和S1的维度排序不一致,是因为此时计算的投影矩阵是降序排列的,与V相反。

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

注:

奇异值分解与协方差矩阵特征值分解

一:特征值分解得到特征值与特征向量,是一个提取矩阵特征很不错的方法,前提是处理的是方阵

            所以对于属于方阵类型的协方差矩阵可以直接做特征值分解。即上述的eig()函数

            [V D] = eig(C) 

          特征值V:表示的是各维度的方差(默认升序排列)

           特征向量D:每一特征值对应一特征向量。第一特征向量是数据特征值(方差)最大的方向,第二特征特征向量与第一特征向量垂直的方向上数据特征值(方差)最大的方向,第三特征向量与第二特征向量垂直的方向上数据特征值(方差)最大的方向,以此类推。

 

二:奇异值分解是一个能适用于任意的矩阵的一种分解。

分解形式  

 A_{_{m*n}} = U_{m*m}\Sigma{_{m*n}} V_{n*n}^{T}

AA^{T}\cdot U=\lambda\cdot U        \lambda 特征值,U 特征向量,左奇异向量

A^{T}A\cdot V=\lambda \cdot V       \lambda 特征值 , V特征向量,右奇异向量

奇异值构成\Sigma(对角线)

\sigma _{i}=\sqrt{\lambda _{i}}

[U, S ,V] =svd(A)

svd()函数只适合行数m大于列数n的矩阵,如果行数m小于列数m,可对其转置矩阵做SVD分解

 

- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

间断性更新、完善吧。

分享,多担待。望有帮助

 

 

 

 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值