Andrew Ng机器学习公开课笔记–Principal Components Analysis (PCA)

网易公开课,第14, 15课
notes,10

之前谈到的factor analysis,用EM算法找到潜在的因子变量,以达到降维的目的

这里介绍的是另外一种降维的方法,Principal Components Analysis (PCA), 比Factor Analysis更为直接,计算也简单些

参考,A Tutorial on Principal Component Analysis, Jonathon Shlens

 

主成分分析基于,

在现实中,对于高维的数据,其中有很多维都是扰动噪音,或有些维是冗余的,对描述数据特征没有作用

比如我们在描述汽车速度的时候,用不同的单位mph or kph作为两维,其实只需要其中一维即可

那么如果对于一个高维数据,比如3维空间,大部分数据都集中于一个二维平面,那么我们用这个二维平面的两个主向量来替代3维向量,就达到降维的目的

并且这样的也尽可能的保留了原始变量的信息不丢失

推而广之,对于n维空间,数据点集中于一个k维的超平面,那么我们就可以说这个超平面的k个主向量为主成分

看NG说的直升机自动驾驶的例子,描述直升机驾驶员的水平
x1,表示驾驶技能;x2,表示驾驶的爱好和兴趣,这两个维度其实是极度相关的,如下图
可以看到其实所有点都是集中在u1这个axis附近的,所以我们可以用u1作为主成分来替代原先的x1和x2

image

其实可以看出,u1和u2是对x1和x2进行旋转的结果,旋转后发现其实数据集中在u1维度,u2方向表示noise
对于n维空间,旋转后,发现用其中的k维就可以很好的描述数据,那么这k维就是主成分,并且坐标轴都是正交的,即特征间是独立的
所以旋转后,选取得到的主成分也都是独立的

用特征值和特征向量再解释一下,
对于一个n维矩阵,当前的n个特征即坐标轴,并不一定可以很好的反映数据,比如上面的例子看起来数据和两个坐标轴都是有很大相关性的
所以我们通过旋转或线性变换,来找到可以更好的反映数据的新的坐标轴,比如上面的u1,u2
这些向量,称为特征向量,而特征值表示该特征向量的重要性,即数据是否集中于该维上
这时你会发现,少部分的特征向量的特征值占了特征值总和的绝大部分,而大部分的特征向量的特征值都很小
比如上面的例子u1的特征值很大,而u2的特征值就很小
所以你可以选择top k特征值的特征向量,来近似原来的n个特征向量,从而达到降维,且尽量的不丢失数据信息

知道主成分分析的原理,下面的问题就是如何找到主成分?

首先做预处理,zero mean and unit variance

image

1和2,使x的均值为0
3. 算均方差
4. normalization 偏差,因为每维上的scale是不一样的,比如一维是体重80,一维是身高1.8,所以需要规范化

好,如何找到u?

One way to pose this problem is as finding the unit vector u so that when the data is projected onto the direction corresponding to u, the variance of the projected data is maximized.

即找到一个单位向量,让数据投影到u上的点的方差最大,即最分散

为什么?
首先我们的目的是找到那个子超平面,使得数据点尽量集中在这个超平面上,即点到这个超平面的距离尽可能的小
如下图,比较直观,如左图,当点到u向量距离最小时,方差是最大的
当选取右图的方向时,方差是最小的

再者,方差大,点比较分散,才便于去区分

image image

形式化的表达出来,
部分参考,主成分分析(Principal components analysis)-最大方差解释

To formalize this, note that given a unit vector u and a point x, the length of the projection of x onto u is given by image

image

所以所有点的方差和为,

image

其中,中间那块是x的协方差矩阵,
设,
imageimage

imageimage

上面的式子表示为,

image

两边同时乘上u

image

image ,这个是特征向量和特征值的公式
我们上面的目标是最大化image的情况下求u,到这里转变为求x的协方差矩阵image,特征值image最大的特征向量u

简单解释一下特征向量和特征值

http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%B5%E5%90%91%E9%87%8F

矩阵可以看作是线性变换,所以上面公式可以看成,对向量u进行线性变换image,得到的向量仍然在同一方向上,只是发生伸缩(即数乘变换)
这样就称u为线性变换或矩阵image的特征向量,而image为对应于该特征向量的特征值

可以看到对于PCA的求解其实很简单, 只需要下面几步,
1. normalized zero mean and unit variance
2. 算出协方差矩阵
3. Find top k 特征向量


PCA的应用非常广泛,

压缩数据
可视化,高维数据无法可视化,降到2维或3维便于可视化
降低over-fitting, 用高维数据进行supervised learning,模型复杂度比较高,容易过拟合,通过PCA降维达到防止过拟合的作用
去噪音,比如对于脸部识别,100×100的pixel,就是10000特征,通过PCA降维可以找到主成分特征
异常检测,通过PCA可以找到由k个主成分组成的超平面,如果新的数据离该超平面很远,就说明可能是异常数据

 

奇异值分解(Singular Value Decomposition)

对于PCA有个问题,是如果x的维度很高,那么算出协方差矩阵image,就是相当耗费空间和困难的事

比如对于谈到的脸部识别10000维的x,10000×10000的协方差矩阵
比如文本分析,可能维度更高
对于文本分析,之所以要使用PCA,因为对于naive bayse而言,所有特征都是独立的
即如果有两篇文章x1,x2
x1中含有learn
而x2中含有study
对于bayse分类而言,这两篇文章是完全不相关的
但是其实learn和study一定是相关的,所以用PCA可以达到降维,并且可以更准确的描述相关性
称为LSI(latent semantic indexing),参考机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

这种高维的PCA问题,就需要用SVD去求解

SVD用于把一个大矩阵分解成若干个小矩阵,便于存储和分析,具体参考上面blog里面的reference


A矩阵,SVD分解成,UDV-transpose

image

其中U的列,是A×A-transpose的特征向量eigenvector
而V的列,是A-transpose×A的特征向量

为什么?不知道,有空复习线性代数

image

对于x的协方差矩阵image,可以表示为X-transpose*X,为什么?直接算下就知道

我们的目的就是算出image的特征向量,即X-transpose*X的特征向量

image

根据前面SVD的定义,我们知道X矩阵的SVD分解,中V的列就是X-transpose*X的特征向量
所以对于X进行SVD分解,就解决了PAC问题
X矩阵是比较小的,比如文本50000特征向量,100个文本,那么X就是100×50000d的svd分解,比对协方差矩阵50000×50000做特征值向量解要简单的多

 

另外在上面的blog中引用数学之美中LSI的例子
比如对m个文本进行聚类,每个文本n个特征,n一般都很大比如50000
那么传统做法,就是余弦法,每个文本之间通过余弦法来计算相似度,这个计算量很大
而用SVD分解,就可以很简单
对于A,表示m个,n个特征的文本矩阵

image

进行svd分解,

image

这边解释一下,svd分解,应该是分解成mn = mm × mn × nn
但是这样分解出来的子矩阵仍然很大,所以近似成,

image

其实和特征向量一样,只是选取奇异值top r的那些向量,进行了压缩

而对于文本聚类而言,r=100,就代表类,也就是LSI中所谓的latent semantic
相当于现在你不用比较每个单词特征来判断文本是否相似,而是比较类特征是否相似,这个不但有效降维,而且解决原来上面提到的learn,study这样的同义词的问题

“三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示这类词中每个词的相关性。最后一个矩阵Y中的每一列表示这类文章中每篇文章的相关性。中间的矩阵则表示词类和文章类之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,我们就可以同时完成了近义词分类和文章的分类”

之前不解,为何做SVD分解,后得到的矩阵可以表示相关性
其实根据前面的定义,知道A-transpose×A等于

image 即行,文本之间的协方差矩阵

而V是A-transpose×A的特征向量矩阵,即文本之间协方差矩阵的特征向量矩阵,这就不难理解了

同样A×A-transpose表示,列,即单词特性的协方差矩阵。。。同理U。。。

 

NG总结无监督学习

首先分为两类,

求子空间,subspace

因子分析,是density estimation算法,会计算出P(x)
主成分分析,单纯的直接求解子空间,不是一个概率算法

所以如果单纯为了降维和求解子空间,使用PCA
如果需要使用概率P(x)就使用因子分析

求聚类,clumps或group

混合高斯,是density estimation算法
K-means,单纯聚类算法,不是一个概率算法

posted on 2014-08-13 15:59  fxjwind  阅读(2105)  评论(0编辑  收藏  举报