PCA(主成分分析)的简单理解

转载自: http://www.cnblogs.com/hapjin/p/6728697.html

  PCA(Principal Components Analysis),它是一种“投影(projection)技巧”,就是把高维空间上的数据映射到低维空间。比如三维空间的一个球,往坐标轴方向投影,变成了一个圆。球是3维的,圆是2维的。在球变成圆的这个投影过程中,丢失了原来物体(球)的一部分“性质”—圆不是球了,只有面积没有体积了;也保留了原来物体的一部分性质—圆 和 球 还是很像的……
  而对于一个训练样本y而言,假设它有M个特征(M维),y={y1, y2, … yM},通过PCA,进行投影,降维成D维(M>D)。为什么要降维?最主要的两个原因是:
①可视化,我们只能看到一维、二维、三维空间上的物体,当某物体需要4维或以上特征表示时,只能想象了……
②特征选择(feature selection),比如说采集到的某个样本 由 20维特征 组成,其中有一些特征属于“噪音(noise)”,而由于某些原因,我们不想要这些“噪音”。又比如说,存在特征冗余,描述一个球,可以用如下特征:(体积、面积、直径、半径),其实我只需要知道半径、直径、面积、体积这些都可以通过公式求出来。因此,体积、面积 、直径这些特征,相对于半径来说,是冗余的特征。

如何降维?
  PCA降维的目标就是:找到一种投影方式,将原来的M维样本y 变成 D维样本x,并且使得投影之后的D维样本x,能够尽可能多地保存原来的样本y中的信息。由于将y投影成x,可以有不同的投影方向,那哪个投影方向比较好呢?即,能够尽可能多地保存原来的样本y中的信息呢?
  可以使用方差来衡量投影方向的好坏。如下图:

PCA(主成分分析)的简单理解

  上图中有“两团点”,在聚类算法中称为有两个聚簇。将这两个簇中的点往B方向投影,B箭头指向的那条直线上的点,表示 投影之后得到的新样本点,已经看不出有两个簇了。而此时,得到的方差是σB2=8.35.
  往A方向投影,A箭头指向的那条直线上的点,还能够明显地看出有两类,即还能够保存“两个簇“的结构,这说明投影方向A比B 要好,因为原来的样本点有两个簇,而往A方向投影后,还能看出有两个簇。此时得到的方差σA2=17.37.
这表明:可以使用 投影后的所有样本点的 方差大小,来衡量投影方向的好坏!
  假设有N个样本点,用Y表示,每个样本点是M维的。现在使用PCA降维,降成D维的,用X表示。X中还是有N个样本点,只是每个样本的维数变成D维的了。
这种投影方式,用矩阵乘法表示:XND=YNMWMD

XND=YNMWMD=[y11y12y1my21y22y2myn1yn2ynm][w11w12w1dw21w22w2dwm1wm2wmd]=[x11x12x1dx21x22x2dan1an2xnd]

对于投影之后的样本x 的第d个特征xnd而言,有:

xn1=w1Tyn,xn2=w2Tyn,...,xnd=wdTynxn=(wn1,wn2,...,wnd)T

也就是说,PCA降维的本质是:找到一个M*D维的矩阵W。可以对W=(w1,w2,…wd)进行一些约束:||wi||=1,且wiTwj=0(j!=i)4,只要W满足:X=Y*W即可。
在数学上,PCA投影是一种线性变换。因为,根据线性变换的定义:
给定函数L:Rn>Rm,如果:
1. 对于任意的x belongs to Rn,a 属于实数R,有L(a*x)=a*L(x)
2. 对于任意的x,y belongs to Rn,有L(x+y)=L(x)+L(y)
则称函数L是一个线性变换。线性变换对加法和数乘封闭。上面的条件1,表示L对数乘封闭;条件2,表示L对加法封闭
而对于矩阵A而言, A*x=b,是满足线性变换的定义的。比如,对于向量x和y,A(x+y)=A*x + A*y;对于实数a,A(a*x)=a*A*x
将矩阵A 作用于 向量x 上,即矩阵A与向量x相乘,就相当于 函数L 作用于x上。
因此,由xn=xn1,xn2,...xnd)T=WTyn,可知:PCA是一个线性变换。

回到公式XND=YNMWMD,如何选择合适的W矩阵呢?—-使用方差最大来确定W矩阵。因为 方差可以衡量投影方向的好坏。
而将矩阵A与向量u相乘,其实就是改变了向量u的方向和大小而已。但是,如果向量u是矩阵A的特征向量,那么 A*u 不会改变向量u的方向。如下图:

PCA(主成分分析)的简单理解

在求解 投影后的样本集X 的方差之前,先假设原始样本集Y的每一维特征的均值为0(m个0),即y¯=[0,0,...0]T。为了简化讨论,假设将原来的M维降成 D=1维。此时,W矩阵就退化为只有一个向量。即寻找一个向量w,对于Y中任何一个样本yn=(yn1,yn2,...ynm),有xn=(xn1,xn2,...xnd)=(xn1)=wTyn
根据公式:xn=wTyn 得到样本集X的均值为:

PCA(主成分分析)的简单理解
再根据方差的定义,和 X的均值为0,故X的方差为:
PCA(主成分分析)的简单理解
对于样本集Y而言,根据样本协方差矩阵的定义 和 y的均值y¯=0,可知:C与样本协方差矩阵密切相关。
因此,要想最大化X的方差,就是最大化wTCw,而C是一个确定的值—由Y的协方差矩阵决定了。因此,我们的目标是尽可能地使w大,而根据我们前面的约束:||w||=1。故最大化wTCw可以使用拉格朗日乘子,转化成如下的约束优化问题:
PCA(主成分分析)的简单理解

通过求偏导数,求得:使L最大化 的w的公式:Cw=λw。而这刚好是特征向量的定义,λ是矩阵C的特征值,w则是对应的特征向量。
由于 ||w||=wTw=1σ2=wTCw,左边乘上wTw,得到:σ2wTw=wTCw,也即:σ2w=Cw,因此方差σ2就是特征值λ,而最大化方差,其实就是选择矩阵C的最大化的特征值而已相应的变换向量w,其实就是特征值对应的特征向量。
因此,更一般地,将原来的样本集Y,M维特征 降到 D维,其实就是计算矩阵C(与Y的协方差矩阵息息相关)的特征值和特征向量,由于 C 是一个M*M维的矩阵,因此一共有 m 个特征值,及其对应的 m 个特征向量。而我们只需要选择前D个最大的特征值对应的特征向量,并将之 作为线性变换矩阵 W 即可。

参考文献:《a first course in machine learning》第七章
原文:http://www.cnblogs.com/hapjin/p/6728697.html

后记:
其他帮助理解的观点:
1. 主成分分析就是把协方差矩阵做一个奇异值分解,求出最大的奇异值的特征方向。
2. 上面说的都太抽象了,我认为,从物理意义上说,就是计算各维度之间的相关性(前提是已经经过白化)。
由于样本特征均值白化后为0,各特征方差一样,计算得到的协方差矩阵,其中元素的值越大,则说明对应下标的特征之间相关性越高。PCA就是基于这种性质。

关于协方差的概念可以参考:http://www.cnblogs.com/chaosimple/p/3182157.html
1. 协方差在统计学的基本概念
  统计学里最基本的概念就是样本的均值、方差、标准差。首先,我们给定一个含有n个样本的集合,下面给出这些概念的公式描述:
PCA(主成分分析)的简单理解
  均值描述的是样本集合的中间点,它告诉我们的信息是有限的,而标准差给我们描述的是样本集合的各个样本点到均值的距离之平均。
  以这两个集合为例,[0, 8, 12, 20]和[8, 9, 11, 12],两个集合的均值都是10,但显然两个集合的差别是很大的,计算两者的标准差,前者是8.3后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是n,是因为这样能使我们以较小的样本集更好地逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。
2. 为什么需要协方差
  标准差和方差一般是用来描述一维数据的,但现实生活中我们常常会遇到含有多维数据的数据集,最简单的是大家上学时免不了要统计多个学科的考试成绩。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子的欢迎程度是否存在一些联系。协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:
PCA(主成分分析)的简单理解
来度量各个维度偏离其均值的程度,协方差可以这样来定义:
PCA(主成分分析)的简单理解
协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐越受女孩欢迎。如果结果为负值, 就说明两者是负相关,越猥琐女孩子越讨厌。如果为0,则两者之间没有关系,猥琐不猥琐和女孩子喜不喜欢之间没有关联,就是统计上说的“相互独立”。

从协方差的定义上我们也可以看出一些显而易见的性质,如:
PCA(主成分分析)的简单理解
3. 协方差矩阵
前面提到的猥琐和受欢迎的问题是典型的二维问题,而协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算n!/[(n2)!2]个协方差,那自然而然我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义
PCA(主成分分析)的简单理解
这个定义还是很容易理解的,我们可以举一个三维的例子,假设数据集有三个维度,则协方差矩阵为:
PCA(主成分分析)的简单理解
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差
4. Matlab协方差实战
必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数:
首先,随机生成一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。
PCA(主成分分析)的简单理解
图 1 使用Matlab生成样本集
根据公式,计算协方差需要计算均值,前面特别强调了,协方差矩阵是计算不同维度之间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列是一个维度,因此我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:
PCA(主成分分析)的简单理解
图 2 将三个维度的数据分别赋值

计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:
PCA(主成分分析)的简单理解
图 3 计算三个协方差

协方差矩阵的对角线上的元素就是各个维度的方差,下面我们依次计算这些方差:
PCA(主成分分析)的简单理解
图 4 计算对角线上的方差

这样,我们就得到了计算协方差矩阵所需要的所有数据,可以调用Matlab的cov函数直接得到协方差矩阵:
PCA(主成分分析)的简单理解
图 5 使用Matlab的cov函数直接计算样本的协方差矩阵

计算的结果,和之前的数据填入矩阵后的结果完全相同。

  1. 总结
      理解协方差矩阵的关键就在于牢记它的计算是不同维度之间的协方差,而不是不同样本之间。拿到一个样本矩阵,最先要明确的就是一行是一个样本还是一个维度,心中明确整个计算过程就会顺流而下,这么一来就不会迷茫了。