【machine learning】徒手实现PCA——训练篇

最近在休假,没事儿写写总结。年龄大了,本来以前用的很熟,理解很到位的东西,现在一时半会儿却想不出来了。索性有时间做做总结,方便自己,也惠及大家~

这篇文章主要介绍PCA的训练。在百度文库、百科里看到许多相关的词条,但是有些方法细节写的并不是很清楚,如果读者需要代码实现,要走很多弯路。结合我的理解,以及在CMU的课程学习和实践,把一些细节详细记述一下。这里主要使用了矩阵的描述,其实是将很长很长的公式抽象化,而且读者看起来更容易理解。如果对矩阵描述不适应,那就先把整个文章读完,然后再按习惯的方法理解。

1、PCA想法

我在SVM那篇文章吐槽过外国人喜欢起一些高大上的名字,比如,支持向量机……这里又难免吐槽一下,主成分分析,主成分是个毛线?分析个毛线?好吧,我们是追求高B格的码农,就叫他PCA好了。可是一定要理解,PCA到底是在搞个啥。简而言之,PCA的作用在于——降维。降维是统计以及AI领域,特别是现在所谓大数据时代老生常谈的问题。PCA是产生比较早的,实现较为简单地,现在也用的颇为广泛地。另外还有ICA——独立元素分析,以及传说中得压缩感知,我会在本文最后面后话部分分析这几个方法的特点和优劣。

我们可以形象的理解PCA,可以分为三步:

1)依照数据的分布,重新建立新的正交坐标系;

2)留下分布较为分散(方差大)的几个维度 “pivot”,省略较为集中的维度(方差小);

3)将原数据投影到新的,已经省略维度的坐标系下。

ok,好像实现的难点就集中在了第一步,至于第二步,怎么取舍重要的维度,那就是作为用户的你来取舍了。而第三步,如果这里有疑问,亲,好好看看线性代数投影那一章节吧。虽然我会在后面为了完整性描述一下,可这是大一时候的基础啊!以后会很常用的!不能忘啊!

2、PCA——主元素在哪里啊?

【machine learning】徒手实现PCA——训练篇_第1张图片

借用一个经典的45°椭圆数据分布示例图(本图出自wiki http://en.wikipedia.org/wiki/Principal_component_analysis ),现有x,y坐标都不能很好地单独描述数据的分布。但是可以找到新坐标,x‘,y’,从直觉上讲,我们想在y'这个维度上,数据分布方差很小;数据主要分布在x'轴上。方差作为衡量标准是很符合我们思维习惯的,这也跟PCA最早提出来的方法相吻合,不过PCA使用的协方差矩阵,covariance matrix,来衡量整个原始数据中,两个坐标系的相关程度。ok,下一步就是如何找那个方差最大的方向了。我们现在有了协方差矩阵,主对角元是目前x,y坐标的自方差,其他元素是协方差,那么各种方差最集中(最大)的方向如何找?想没想到特征值的直观定义——能量集中的方向?其实我们现在找的,方差最大的方向,就是x',更是协方差矩阵的主特征向量(对应特征值最大)!

所以主元素就是协方差矩阵的各个特征向量!这里需要有个说明,由于特征向量都是正交的,所以PCA的元素们也都是正交的。这也是PCA的一个局限性。如果想要突破这个局限性,请参看ICA。

以上就是对PCA技术的大体描述,后面是实现的技术细节。

3、如何快速计算出主元素?

1)correlation matrix 和 covariance matrix求法

网上看到对协方差的定义好长好麻烦,好多朋友也是用定义计算协方差的,嗯,理解和计算起来有点麻烦。我们用矩阵的语言来描述方法,可以很快得理解协方差矩阵的求法。我们有数据矩阵X,X的每一行都是一组观测数据。

先求出数据矩阵X的均值向量C(centroid),所有数据减去这个均值向量C,得到Xn。几何上,这个工作就是求出数据的分布重心,并平移数据点到坐标原点。

Xn的转置 点乘 Xn 就是X的协方差矩阵COV,不信你可以跟定义核对一下。x_n^T

最后对COV求特征向量即可。

covariance matrix 有个兄弟,叫correlation matrix,求法比协方差矩阵少了一步减法(不减均值向量)。其实就是偷个懒,省去平移数据那个步骤,最后结果会差一点儿而已。

2)原来好多维度,但是训练数据不多,算不过来怎么办?!

那就看X·Xt 和 Xt·X哪个维度更大。一般来讲我们计算Xt·X就可以了,如果实在太大,我们可以计算X·Xt ,求出来向量µ, Xt·µ就是原来要求的特征向量。自己推导……

3)我用C/C++,懒得用matlab,也懒得装开源库,能不能计算出来主元?

power method不解释。注意可能不收敛。

4、算出主元素后,如何实现降维?

假设Xi是其中一个数据,1*m行向量。P是m*k维度主元矩阵,k是主元数目(k≤m)。做简单地投影Xi·P=Xi' 就可得到在主元构成的新坐标及维度下的降维描述.

5、后话

刚才提到了PCA得局限性,那就是新生成的主元们必须正交,还有一个可能容易忽略,就是新生成的维度数量不能多于原有数据向量的rank。如果想克服正交的限制,可以使用ICA,独立元素分析;如果连维度的限制都想摆脱,也不是不可以,请移步compress sensing 压缩感知。为啥后面两个很少听说过?麻烦呗……
如有纰漏 敬请指正

你可能感兴趣的:(Machine,Learning)