FastEasyMapFastEasyMap08-22 02:02

PCA分析以及MATLAB实现

(前半部分解释来自吴恩达的机器学习视频)

一、数据降维

(1)二维数据->一维数据


降维到一维之后的数据:


(2)三维数据->二维数据


上图中的数据可以投影到二维平面上,大致在如下平面上:


投影之后如下图所示:


二、主成分分析的原理

(1)PCA投影

假设有一组二维数据如下图所示:


若将上图中的数据投影到图中的红色直线上,注意到原始数据到投影数据的距离为蓝色线段,且距离最短。PCA求解的目标是:将原始数据投影到低维平面上,使得图中蓝色线段的和达到最小,即投影误差最小。


换一个投影方向,投影到图中玫红色的直线上,投影误差达到最大化。


将二维数据投影成一维数据,需要寻找一个投影方向,或者是一个n维向量


将三维数据降为二维数据,需要寻找两个n维向量,组成一个投影平面:



(2)PCA与线性回归的区别

在PCA由二维投影成一维的过程中,与线性回归类似,都是寻找一条直线,但是本质却不同。左图是线性回归中的预测直线,预测值与真实值之间的误差是图中蓝色线段,可见蓝色线短和y轴平行;右图是PCA的投影方向,蓝色线段是投影误差,可见蓝色线段垂直于投影方向,是最短距离。除此之外,线性回归需要使用标记数据,获取样本的类别标记,而PCA算法则是无监督的,不需要使用样本的类别标记。


(3)PCA算法

再进行PCA算法之前,首先将数据进行归一化处理。当数据特征很多时,特征的范围差别可能很大。


算法过程:

1、求数据矩阵的协方差矩阵Sigma;

2、计算Sigma的特征值与特征向量;

3、选出特征矩阵中的前k列,与原始数据矩阵X相乘,得到降维数据Z。

注:在Sigma的特征值与特征向量的计算方法中,使用奇异值分解函数svd或者特征值求解函数eig都可以求得特征向量(协方差矩阵是特例),在这里使用svd,因为后面要使用到svd中的结果确定k的值。


svd中得出的结果,U是Sigma的特征向量,S的对角线是Sigma的奇异值。关于svd函数的详细解释,请参考博客点击打开链接

最后的计算公式为:


z就是最后投影得到的降维样本。

(4)K值的选择

先看两个误差:第一个误差是投影误差,即投影之前的数据与投影之后的数据之差;第二个误差是数据的方差,由于数据进行归一化,所以相当于样本向量到零向量的距离。选择适当的K值,使二者的比值尽可能小,比值越小,也就代表保留了越大的方差。因为PCA算法的原理,是使投影之后的数据,方差尽可能的大,因为方差越大,表明数据之间的差异越大,也就越容易区分。

一种计算K值的方法是:使用代入法,一个一个的试验K值,直到满足下式为止。


另一个方法是:在SVD的求解当中,S矩阵是一个对角矩阵,可以利用对角线元素进行保留方差百分比的计算:n是样本总数,对于给定的K值,直接计算下式是否满足等式,比起使用上图的计算方法要简单许多。


(5)重建数据


(6)使用PCA的建议

1、数据压缩:减少内存或者硬盘的存储空间;

2、对数据降维,加速学习算法;

3、将数据降低到二维或者三维,可视化数据。

疑惑点:

1、PCA的实现方式有两种,一种是如上所示,第二种是:

(1)计算Sigma=X*X’;

(2)计算[V,D]=eig(Sigma);

(3)选择特征值中前k大的特征值对应的特征向量,组成投影矩阵U,与原始数据矩阵相乘,进行降维;

在第二种算法中,对特征值进行排序,选择前K个较大的特征值对应的特征向量,投影后得到最大的K个主成分。在第一种算法中,通过SVD计算,得到向量U,为什么不选择较大的特征值对应的特征向量,而是直接选择U中的前K个向量呢?因为得出的[U,S,V]中,S中对角线上的元素是默认按照由小到大的顺序排列的,所以不必排序选择。

2、PCA降维不是去掉了数据的某些特征,而是将数据映射到低维空间中表示,而这些低维的数据,足以代表高维的数据。

程序之家二维码

000
评论