zoukankan      html  css  js  c++  java
  • 协方差矩阵与PCA降维

    1.方差/标准差/协方差

    首先需要明确一点,以上三个结果都是针对一整个数据集而言,并非某个单独变量。

    以二维数据集X={ [1,2],[3,4],[5,6],[7,8] }为例,

      先求其期望(均值)u = [1,2]+[3,4]+[5,6]+[7,8]/2= [4,5] ;

      数据集X零均值处理后X' = {[-3,-3], [-1,-1], [1,1], [3,3]}

      则其方差矩阵 ∑ = ΩXi*Xi' / 4 = [5,5; 5,5] 

    方差的大小代表着数据的波动情况,方差越小,波动越小。

    而对于协方差,上面的方差为一种特殊情况,即X = Y。协方差的大小体现了两个变量的相关程度,协方差越大,说明越‘正相关’,如果协方差为负数,则说明‘反相关’;协方差为零,说明两个变量不相关,但不一定独立。

    还有协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。

    样本方差:https://www.zhihu.com/question/20099757

    协方差:https://www.zhihu.com/question/20852004

    协方差矩阵与PCA:https://wenku.baidu.com/view/ce7ee04bcc175527072208ca.html

    协方差矩阵与特征值:http://blog.csdn.net/Yelbosh/article/details/52079462

    PCA降维就是利用协方差矩阵最大能量方向上做投影(特征值最大,代表散度最大,即拉伸最长,投影后数据重叠程度最小,保留信息越多)

    PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

    PCA原理详看这里:http://blog.codinglabs.org/articles/pca-tutorial.html

    先是了解矩阵点乘的物理意义,即投影。

    再了解矩阵与向量的乘积 c= A·b (A为m*n维矩阵,b为n*1的向量) ,结果是一个m*1维的向量,这就是线性变换。以A矩阵中每一行的向量作为一组新的基后,向量b在这组基下的表示就成了 c,c中每一个值都是在对应基底下的投影值。

    所以对于有着n个特征值的数据集X,按列存放每个数据,构成一个n*m的矩阵(m为样本个数),此时我们需要寻找一个线性变换矩阵P,使得X经P变换后,特征数从n减少到k。即Y=PX 是一个 k *m的矩阵,达到对数据X进行降维。

    但是对于P的选取,需要保留最大的信息又能去除数据间的冗余。这里用C表示X的协方差矩阵C = X·X', D为Y的协方差矩阵 D =Y·Y'

    这里需要了解的是协方差矩阵与特征值,cov(a,b)越大说明a/b越相关,cov(a,b) = 0表明a/b不相关。cov(a,a)代表着数据本身变化的剧烈程度,我们认为有效信息的方差大,而噪声的方差就很小。

    有了方差的概念,所以数据降维就是要保证降维后得到的Y的协方差矩阵对角线上的值尽可能大,非对角线元素值尽可能为0(D是一个对角矩阵就好了)。这样就达到减少数据维数并保留绝大部分信息的目的。

    现在我们从Y的协方差矩阵D着手:

    D = Y·Y' = PX·(PX)' 
                 = PXX'P
                 = PCP'

    C = P'DP

    神奇的一幕出现了,我们需要的变换矩阵P就是使得C对角化的矩阵。由于C是对称矩阵...(等等后面一系列原因,可以看链接里的详细介绍,这里已经不重要了,我们要找的P已经很明显了)

    对协方差矩阵做SVD分解,即可得到P矩阵,降维时,取P矩阵的前k行就是最终需要的变换矩阵了。

    ==============

    上面的一般的PCA降维,其都默认了n<m 即样本数量大于特征维数。这里用到一个定理:秩(AB)≤min(秩(A),秩(B))

    实际当中,常见还是n>>m的情况,比如25个64*64的图像块,拉成一个(4096,25)的数据矩阵,这时候X·X'是一个4096*4096的矩阵,对其进行SVD有点不现实。

    这里考虑到能不能用 X'·X 来简化计算呢(25*25矩阵),看下面的推导:

    X·X' = PAP'1)
    X'·X = QAQ'2)
    
    在(2)两边分别乘 X 、X' 得到
    
    XX'·XX' = X·QAQ'·X'     将(1)代入左边得到
    
    PAP'PAP' = PAAP = XQAQ'X'
    
    所以P = XQ/sqrt(A)

    在求特征向量的时候,需要在X'·X的特征向量的基础上在左乘X,并除以相对应特征值的开方即可。

     这里贴一个PCA在人脸数据上的应用:http://blog.csdn.net/mpbchina/article/details/7384425



  • 相关阅读:
    PHP学习笔记(三)
    简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider 熊,我
    简单的学习心得:网易云课堂Android开发第三章自定义控件 熊,我
    简单的学习心得:网易云课堂Android开发第五章SharedPreferences与文件管理 熊,我
    简单的学习心得:网易云课堂Android开发第四章服务、广播与酷特性 熊,我
    本地Server发布外网Web应用(Oray实现)
    玩玩微信公众号Java版之准备
    C语言的第零次作业
    C语言博客作业02循环结构
    C语言博客作业03函数
  • 原文地址:https://www.cnblogs.com/caffeaoto/p/8527466.html
Copyright © 2011-2022 走看看