前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习基础与实践(三)----数据降维之PCA

机器学习基础与实践(三)----数据降维之PCA

作者头像
CDA数据分析师
发布2018-02-05 17:38:12
1.2K0
发布2018-02-05 17:38:12
举报
文章被收录于专栏:CDA数据分析师

在数据处理中,经常会遇到特征维度比样本数量多得多的情况,如果拿到实际工程中去跑,效果不一定好。一是因为冗余的特征会带来一些噪音,影响计算的结果;二是因为无关的特征会加大计算量,耗费时间和资源。所以我们通常会对数据重新变换一下,再跑模型。数据变换的目的不仅仅是降维,还可以消除特征之间的相关性,并发现一些潜在的特征变量。

一、PCA的目的

PCA是一种在尽可能减少信息损失的情况下找到某种方式降低数据的维度的方法。通常来说,我们期望得到的结果,是把原始数据的特征空间(n个d维样本)投影到一个小一点的子空间里去,并尽可能表达的很好(就是说损失信息最少)。常见的应用在于模式识别中,我们可以通过减少特征空间的维度,抽取子空间的数据来最好的表达我们的数据,从而减少参数估计的误差。注意,主成分分析通常会得到协方差矩阵和相关矩阵。这些矩阵可以通过原始数据计算出来。协方差矩阵包含平方和与向量积的和。相关矩阵与协方差矩阵类似,但是第一个变量,也就是第一列,是标准化后的数据。如果变量之间的方差很大,或者变量的量纲不统一,我们必须先标准化再进行主成分分析。

二、PCA VS MDA

提到PCA,可能有些人会想到MDA(Multiple Discriminate Analysis,多元判别分析法),这两者都是线性变换,而且很相似。只不过在PCA中,我们是找到一个成分(方向)来把我们的数据最大化方差,而在MDA中,我们的目标是最大化不同类别之间的差异(比如说,在模式识别问题中,我们的数据包含多个类别,与两个主成分的PCA相比,这就忽略了类别标签)。

换句话说,通过PCA,我们把整个数据集(不含类别标签)投射到一个不同的子空间中,在MDA中,我们试图决定一个合适的子空间来区分不同类别。再换种方式说,PCA是找到数据传播最广的时候的最大方差的轴axis,MDA是最大化类别与类别之间的区别。

上文我们提到了子空间,那么怎么样去寻找“好的”子空间呢?

假设我们的目标是减少d维的数据集,将其投影到k维的子空间上(看k<d)。所以,我们如何来确定k呢?如何知道我们选择的特征空间能够很好的表达原始数据呢?

下文中我们会计算数据中的特征向量(主成分),然后计算散布矩阵(scatter_matrix)中(也可以从协方差矩阵中计算)。每个特征向量与特征值相关,即特征向量的“长度”或“大小”。如果发现每个特征值都很小,那就可以说明我们的原始数据就已经是一个“好的”空间了。但是,如果有些特征值比其他值要大得多,我们只需要关注那些特别大的特征值,因为这些值包含了数据分布情况的绝大部分信息。反之,那些接近于0的特征值包含的信息几乎没有,在新的特征空间里我们可以忽略不计。三、PCA的过程

通常来说有以下六步:

1.去掉数据的类别特征(label),将去掉后的d维数据作为样本

2.计算d维的均值向量(即所有数据的每一维向量的均值)

3.计算所有数据的散布矩阵(或者协方差矩阵)

4.计算特征值(e1,e2,...,ed)以及相应的特征向量(lambda1,lambda2,...,lambda d)

5.按照特征值的大小对特征向量降序排序,选择前k个最大的特征向量,组成d*k维的矩阵W(其中每一列代表一个特征向量)

6.运用d*K的特征向量矩阵W将样本数据变换成新的子空间。(用数学式子表达就是

其中x是d*1维的向量,代表一个样本,y是K*1维的在新的子空间里的向量)

四、具体步骤

1.数据准备----生成三维样本向量

首先随机生成40*3维的数据,符合多元高斯分布。假设数据被分为两类,其中一半类别为w1,另一半类别为w2

运行这段代码后,我们就生成了包含两个类别的样本数据,其中每一列都是一个三维的向量

所有数据是这样的矩阵:

结果:

2.作图查看原始数据的分布

结果:

3.去掉数据的类别特征

4.计算d维向量均值

5.计算散步矩阵或者协方差矩阵

a.计算散步矩阵

散布矩阵公式:

其中m是向量的均值:

(第4步已经算出来是mean_vector)

结果:

b.计算协方差矩阵

如果不计算散布矩阵的话,也可以用python里内置的numpy.cov()函数直接计算协方差矩阵。因为散步矩阵和协方差矩阵非常类似,散布矩阵乘以(1/N-1)就是协方差,所以他们的特征空间是完全等价的(特征向量相同,特征值用一个常数(1/N-1,这里是1/39)等价缩放了)。协方差矩阵如下所示:

结果:

6.计算相应的特征向量和特征值

结果:

其实从上面的结果就可以发现,通过散布矩阵和协方差矩阵计算的特征空间相同,协方差矩阵的特征值*39 = 散布矩阵的特征值

当然,我们也可以快速验证一下特征值-特征向量的计算是否正确,是不是满足方程

得出结果未返回异常,证明计算正确

注:np.testing.assert_array_almost_equal计算得出的结果不一样会返回一下结果:

可视化特征向量

结果:

7.根据特征值对特征向量降序排列

我们的目标是减少特征空间的维度,即通过PCA方法将特征空间投影到一个小一点的子空间里,其中特征向量将会构成新的特征空间的轴。然而,特征向量只会决定轴的方向,他们的单位长度都为1,可以用代码检验一下:

因此,对于低维的子空间来说,决定丢掉哪个特征向量,就必须参考特征向量相应的特征值。通俗来说,如果一个特征向量的特征值特别小,那它所包含的数据分布的信息也很少,那么这个特征向量就可以忽略不计了。常用的方法是根据特征值对特征向量进行降序排列,选出前k个特征向量

结果:

8.选出前k个特征值最大的特征向量

本文的例子是想把三维的空间降维成二维空间,现在我们把前两个最大特征值的特征向量组合起来,生成d*k维的特征向量矩阵W

结果:

9.将样本转化为新的特征空间

最后一步,把2*3维的特征向量矩阵W带到公式

中,将样本数据转化为新的特征空间

结果:

到这一步,PCA的过程就结束了。其实python里有已经写好的模块,可以直接拿来用,但是我觉得不管什么模块,都要懂得它的原理是什么。matplotlib有matplotlib.mlab.PCA(),sklearn也有专门一个模块Dimensionality reduction专门讲PCA,包括传统的PCA,也就是我上文写的,以及增量PCA,核PCA等等,除了PCA以外,还有ZCA白化等等,在图像处理中也经常会用到,内容太多,下次再写。

最后推荐一个博客,动态展示了PCA的过程:http://setosa.io/ev/principal-component-analysis/ 写的也很清楚,可以看一下;再推荐一个维基百科的,讲的真的是详细啊https://en.wikipedia.org/wiki/Principal_component_analysis

Charlotte ,数学系的数据挖掘民工,喜欢算法和建模。

欢迎关注我的博客:

http://www.cnblogs.com/charlotte77/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CDA数据分析师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档