主成分分析法原理及其python实现
前言:
这片文章主要参考了Andrew Ng的Machine Learning课程讲义,我进行了翻译,并配上了一个python演示demo加深理解。
本文主要介绍一种降维算法,主成分分析法,Principal Components Analysis,简称PCA,这种方法的目标是找到一个数据近似集中的子空间,至于如何找到这个子空间,下文会给出详细的介绍,PCA比其他降维算法更加直接,只需要进行一次特征向量的计算即可。(在Matlab,python,R中这个可以轻易的用eig()函数来实现)。
假设我们给出这样一个数据集代表m辆不同种类的汽车,每个数据点各个属性代表该类汽车的最大速度,转弯半径等等,假设对每个i都有
(n << m)但是有一点我们不知道,对于某些Xi和Xj来说,最大时速是用不同的单位给出的,一个是用mile/hour,一个是用kilometers/hour,这两个属性显然是线性相关的,至于有一些不同是因为在mph和kph之间的转换造成的,因此,数据其实是近似集中在一个n-1维的子空间里的,我们如何自动侦测并且移除这些冗余呢?
再举一个更加具体的例子,我们现在拥有一个由对遥控直升机飞行员的问卷调查得出的数据集,第i个数据点的第一个分量代表该飞行员的飞行技巧,第二个分量
表示TA对飞行过程的享受程度,因为遥控直升机非常难以操控,所以只有那些真正享受这个过程的人才能成为一个好的飞行员,所以,这两个属性具有很强的关联性,,实际上,我们可以假设数据实际集中在看起来像是一个斜的坐标轴附近,我们可以把这个坐标轴直观理解为一个人与飞行的”缘分”,(这样的直观理解可以帮助理解PCA),如下图所示,我们如何自动计算出u1这个方向呢?
没错,计算u1这个方向的方法就是PCA算法,但是在数据集上运行PCA算法之前,通常我们要首先对数据进行预处理来标准化数据的均值和方差。下面是预处理过程: