主成分分析算法C语言实现,机器学习 线性代数基础 | 5.3 利用特征值分解进行主成分分析(PCA)...

原标题:机器学习 线性代数基础 | 5.3 利用特征值分解进行主成分分析(PCA)

我们通常会通过观察一系列的特征属性来对我们感兴趣的对象进行分析研究,一方面特征属性越多,越有利于我们细致刻画事物,但同时也会增加后续数据处理的运算量,带来较大的处理负担,我们应该如何平衡好这个问题?主成分分析方法就是一个很好的解决途径。

主成分分析方法的首要目标就是减少研究对象的特征维度,但同时又要尽量减少降维过程中不可避免的信息损失。那么通过协方差矩阵的形态启发以及矩阵对角化的理论指引,我们找到了一种解决该问题的有效途径,即利用一组线性无关且维度较少的新特征来代替原始的采样特征,以期达到我们的目的。这一小节里,我们就基于该方法详细展示主成分分析的理论和实践。

5.3.1 数据降维的需求背景

在研究工作中,我们常常针对我们关注的研究对象,去收集大量有关他的特征属性,从而对其进行细致的观测和深入的分析。

比如,在对一组城市进行研究的时候,我们可以从人口、GDP、面积、年降水量、年平均温度、人均寿命、人均工资、人均受教育年份、性别比例、宗教人口、汽车保有量、人均住房面积等维度去收集相关数据。

这里随手一列就是十几个特征属性,其实就算列出一百个来也不足为奇。我们收集越多的特征属性就越方便我们全方面的对事物进行细致的研究和考量,对深层次的规律进行探寻。

但是问题也就来了,随着样本特征属性数量的增多,我们需要分析处理的数据量也是直线上升的,在进行样本聚类、回归等数据分析的过程中,样本的数据维度过大,无疑会使得问题的研究变得愈加复杂。同时,大家很容易能发现一个现象,就是样本的特征属性之间还存在着一定的相关性:比如GDP与汽车保有量之间,人均工资与人均受教育年份、人均寿命之间等等,这些指标之间都是存在着某种关联性的,其实这也增加了问题处理的复杂性。

因此,这种现状让我们感觉到,用这么多彼此相关的特征属性去描述一件事物,一方面非常复杂,另一方面似乎也显得不是那么有必要。我们希望能在原有基础上减少特征属性的数量。

5.3.2 目标:特征减少,损失要小

那么,我们现在就视图来探究这个问题:如何对样本的特征属性进行降维。目标是什么?

归结起来有两点:

第一个目标当然是特征维度要变小,不能使用那么多的特征属性了。

第二个目标是描述样本的信息损失要尽量少。数据降维,一定伴随着信息的损失,但是如果损失的太多了,自然也就失去了意义。

5.3.3 主成分分析法降维的思路

有读者可能会想了,能不能直接挑选一个特征属性,然后将其去掉,通过这种方法简单的实现数据降维?直觉告诉我们,似乎是不行的。这种方法最为关键的一点就是没有考虑到特征属性之间彼此紧密耦合的相关关系。这样独立的对各个特征属性进行分析,是很盲目的。

那么具体该如何做?我们还是举一个非常直观的例子来说明:

假设我们研究的对象有两个特征属性,分别是X和Y,我们对5个样本进行数据采样的结果如表5.1所示。

表5.1 对5个样本进行数据采样的结果表

670a46473fbe4100748a77820e26ef7c.png

我们的目标是对其进行降维,只用一维特征来表示每个样本。我们首先将其绘制在二维平面图中进行整体观察,如图5.2所示。

47dee7f5c42668a84b141060fa34d3ea.png

图5.2 样本数据的分布

在5个样本的特征数据分布图中,我们能挖掘出几个重要的规律。首先,我们来探究这两个特征属性的数据分布和数据相关情况:

代码如下:

71a6318612c86b3dc7ec6c7241a62554.png

运行结果:

结合特征变量X和Y的图像分布以及我们的观察发现,5个样本的特征X和特征Y呈现出正相关性,数据彼此之间存在着影响。

其次,我们如果真要硬来,直接去掉特征X或特征Y来实现特征降维,可行吗?显然是不行的,如图5.3所示,如果我们直接去掉特征X,那么样本2和样本3,以及样本4和样本5,就变得无法区分了。

但是实质上,在降维前的原始数据中,他们显然是有明显区别的。直接去掉特征Y也是一样,这种简单粗暴的降维方法显然是不可取的,他忽视了数据中的内在结构关系,并且带来了非常明显的信息损失。

6e8986a8722dee2fec5d4b1f60ddffe0.png

图5.3 直接进行特征去除会丢失大量信息

我们应该如何调整我们的降维策略?基于上面的现象,直观上而言,思路应该聚焦在这两方面:

一是,要考虑去除掉特征之间的相关性,想法是创造另一组新的特征来描述样本,并且新的特征必须彼此之间不相关。

二是,在新的彼此无关的特征集中,舍弃掉不重要的特征,保留较少的特征,实现数据的特征维度降维,保持尽量少的信息损失。

5.3.4 剖析PCA:构造彼此无关的新特征

首先我们来看第一点,我们尝试用2个新的特征来对样本进行描述,那么为了让这两个新特征满足彼此无关的要求,就得让这两个新特征的协方差为0,构成的协方差矩阵是一个对角矩阵。

而目前我们所使用的原始特征X和Y的协方差不为0,其协方差矩阵是一个普通的对称矩阵。

看到这里,你是不是突然觉得眼前一亮,我们的工作不就是要将当前的对称矩阵变换到对角矩阵么?大的方向的确如此,我们就沿着这个方向,一步一步从头到尾来实施一遍主成分分析 (PCA) 的具体方法。

我们首先回顾一下协方差的定义公式:

感觉公式还不够简练,我们发现如果变量X和变量Y的均值为0,那么协方差的式子就会变得更加简单。

这个其实好办,我们将X中的每一个变量都减去他们的均值 ,同样将Y中的每一个变量都减去他们的均值v。这样,经过零均值化处理后,特征X和特征Y的平均值都变为了0。很显然,这样的处理并不会改变方差与协方差的值,因为数据的离散程度并未发生改变,同时从公式的表达上来看,这个道理也非常清楚。

经过零均值处理后,X和Y的协方差矩阵就可以写作:

605d8517438d8041205ad49e9b2b4051.png

接下来,我们重点来看一下

4720d4eea8e30f4adb13ca9b37468a4a.png

这个矩阵,这个矩阵有很强的规律性,不难发现他就是零均值化后的样本矩阵

e07c6358c9d161e0b8550274f7185018.png

与自身的转置矩阵

63781f06643877e0dd3cb64b8fa55604.png

相乘的结果,即:

协方差矩阵

730cf73924b8b99b2eca7340c7640b86.png

一般而言,在实际情况中X和Y满足线性无关,所以依据我们之前介绍的知识,协方差矩阵C是对称的、正定的满秩方阵。

接下来,我们就想把各个样本的特征X和特征Y的取值用另外一组基来进行表示,由于要求在新的基下表示的新特征彼此无关,那么必然的,新选择的两个基必须满足彼此正交。

我们选择一组新的基, 和 ,他们的模长均为1,彼此之间满足标准正交,前面我们学过,在此条件下,向量

a167bf9e12b8c7eee849bffe7f07e032.png

与向量 的点积就表示向量 a在 方向上的投影,同时由于 是单位向量,那么点积的结果就代表了基向量 的坐标。

那么向量 a在由标准正交向量 和 构成的新基底上的坐标即为

cc6a2fd8c737b5c8b74deed73c4093b9.png

,如果我们令

04f5917b13d0152ad417ab67b3fdf11f.png

,那么可以进一步将其表示为: 。

梳理一下这里所做的工作:

89fa5edd2008d07bf3c810119ff4fe19.png

,就是n个样本的特征X和特征Y的原始采样值。而

5afa4fc1a2e815f90342cc4c0125dcf0.png

(其中

20fb2e24f6d6625c83c77986bc3e9919.png

)。描述的就是这n个样本在新构建的特征下的取值。

此时,我们来实现第一个目标:

即,我们试图让第一个新特征 和第二个新特征 ,二者之间满足线性无关。换句话说,就是要求这两个特征的协方差为0,协方差矩阵是一个对角矩阵。

我们从 这个推导的式子入手,这就将命题转化成了我们再熟悉不过的问题了:去寻找让协方差矩阵 C对角化的 P矩阵。这里还有一个很好的前提条件:协方差矩阵 C是对称矩阵、正定矩阵,他保证了矩阵一定能够对角化,且特征值全都为正。

我们在对称矩阵的那一节里得到过这样的结论:对称矩阵一定可以得到由一组标准正交特征向量构成的特征矩阵 Q。即,矩阵 Q可以表示成为: ,我们进一步将等式 进行整理,得到 的形式,对其进行展开最终得到,

301148b3413f87dd60d184fd2002d121.png

我们将 和

63b7ebe867f38e49231a08b547897e81.png

这两个式子进行类比就会求解出我们想要的转换矩阵 P,结果就是

d7de6adbcc4321a974d61e660729f4ed.png

,其中向量 就是协方差矩阵 C的n个标准正交特征向量。由此,我们再通过乘法运算 PA就能够计算得出彼此线性无关的新特征。

5.3.5 结合例子实际操作

那么在这里所举的实例当中,我们具体来操作一下。首先我们进行零均值化的数据处理工作。

代码如下:

0aa05734caa8fb2c34b52404c75176c4.png

运行结果:

550cdc2053d094e91d20d063594f48cf.png

在上面的过程中,我们对原始数据两个特征的采样值进行了零均值化处理,同时也验证了:零均值化的处理后,协方差矩阵确实不变。

我们接着处理。

代码如下:

360234ae2ea422f7c82dac9f47c85858.png

运行结果:

39bbc6c6adf2875e59e50989af35bb9f.png

由此,我们通过求协方差矩阵 C的特征向量,得到了新选择的两个线性无关的特征投影基,协方差矩阵

78d7f2f39d98512c89fa96a29f4c0feb.png

的特征矩阵为

4fde318ef1f6c5b9f7787dae9cc6c0f3.png

我们结合新得到的两个线性无关的新投影基所在的方向,观察一下经过零均值化处理后的数据分布,如图5.4所示。

9e2c9670e8a984dae2610b3d218e369a.png

图5.4 特征向量作为新的投影方向

然后我们再对对角化矩阵 D进行求解:

812d4ec5e344aa79261319f6b6ac4b2a.png

5.3.6 新得到的特征如何取舍

在上面的一系列操作中,我们构造出了两个新特征。原始特征的方向分别是 x轴的正方向和 y轴的正方向,两个原始特征彼此相关。而新构造的两个特征,方向分别是

f72a051a5471f606702d5a2049292e54.png

bb1e452b176bacd0efd7f266ebb342b9.png

,在这两个方向上构造的新特征协方差为0,满足彼此之间线性无关。

那么,我们将原始特征的采样值变换到两个新选取的投影基上,就得到新的一组特征取值。

代码如下:

7f9b17e461f2e575e14906114ef1634f.png

运行结果:

d21123fb7139fb1f7f8e02118b2a5bf7.png

我们得到的两个结果,就是在原始特征和新构建特征上分别得到的值。我们在此基础上再进行特征维度的降维,让二维数据变成一维。由于这两个新的特征彼此无关,我们可以放心大胆的保留一个、去掉一个。

具体保留哪一个,我们的判定标准就是方差,方差越大的特征,表明这个特征里数据分布的离散程度就越大,特征所包含的信息量就越大;反之,如果特征里数据的方差小,则意味着数据分布集中,表明其包含的信息量就小。那么,我们自然选择保留信息量大的那个特征了。

这里,

ea4411d45770251b891afe20f79e949a.png

方向上的特征对应的方差是2.5,而

e129602a3208a95c0e2ce355b85fb378.png

方向上的特征对应的方差是 0.5。我们决定保留

c407c3116d547fc66d1034617d3056ca.png

方向上的特征取值。

此时,我们完成了主成分的提取,5个样本如果用一维数据来描述,最终的取值就是: ,从而实现了数据的降维。

最终所保留的就是以

70f0ad30e79767ea76c25e7626883647.png

为基向量的坐标值,如图5.5所示。

cc68e1532c0cb85fdbf4a20cb2cc0e1a.png

图5.5 降维后的数据主成分分布

5.3.7 衡量信息的损失

那么,我们怎么衡量数据降维过程中的信息损失?或者反过来说,我们保留下了多少信息?这里介绍主成分贡献率的概念,在上面的例子里,原本一共有两个原始特征,我们保留第一个作为主成分,我们用方差来衡量主成分贡献率:

主成分贡献率为:

1b65986004eab899e3d9e6f9aad4ccab.png

。由此可见,我们在数据降维的过程中,数据压缩率为50%,但却保留了83.3%的信息,感觉效果还是不错的。

5.3.8 推广到n个特征的降维

这里我们推广到一般情况,如果我们有n个特征,如何进行数据降维。这里的思路是完全一样的。

(1)针对采样得到的m个观察样本,我们得到了一个 规模大小的样本数据矩阵 A;

(2)对每一个特征的取值,进行零均值化处理,如果这些特征不在一个数量级上,我们还应该将其除以标准差 ;

(3)利用预处理后的矩阵 A,求n个特征的协方差矩阵: ;

(4)对协方差矩阵进行对角化处理,求得协方差矩阵 C的n个标准正交特征向量,并按照对应的特征值的大小依次排列;

(5)按照事先规定的主成分贡献度,提取满足该数值要求的前k个新构造的特征作为主成分,构造成数据压缩矩阵:

4f345f5aac92b01447624c71c4d16b19.png

(6)通过矩阵相乘 PA实现前k个主成分的提取,将数据的n维特征压缩到k维,实现主成分提取。

本书所涉及的源代码已上传到百度网盘,供读者下载。请读者关注封底“ 博雅读书社”微信公众号,找到“ 资源下载”栏目,根据提示获取。

如果您对本书感兴趣,请进入当当网选购!返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值