图 2. 二维PCA算法思想图(二)
如图2所示,假设以
为起点顺时针旋转一周,我们便可以得到4条有代表性的投影方向,分别是
。对于这4种情况来说,相信绝大多数人都会选择
所在的方向,不过这是为什么呢?很多人可能会说感觉上是,掌柜只能说你的感觉没有错。不过真实的原因是在于降维算法的准则就是降维后的特征表示要尽可能多地保留原有数据的结构信息,直观上来看就是样本之间间距较大重叠部分较少。
例如对于图2所示的样本点来说,如果将其投影到
所在的方向,那么大多数样本点将会密集地聚在一起从而无法有效区分。但是,如果将这些样本点投影到
所在的方向,那么绝大多数样本在新的投影空间中依旧能够有效地进行区分。如图3所示便是在
方向投影后的结果。
图 3. 二维PCA算法思想图(三)
如图3所示,黑色原点便是图2中各个样本在
方向投影后的结果。此时,我们便可以仅通过一个坐标轴来表示这些样本,从而实现了降维的目的。
进一步,如图4所示,如果想要对这些三维空间中的样本点进行降维处理,那么同样也要找到一个最优的投影平面然后进行投影处理。
图 4. 三维PCA算法思想图(一)
如图4所示,如果需要对于这些三维空间中的样本点进行降维,那么同样需要找到其对应的最优平面,如图5所示。
图 5. 三维PCA算法思想图(二)
从图5中可以看出,只有将原始样本投影到
与
所构成的平面中才能最大程度上地保留原始样本点的结构信息,投影后的结果如图6所示。
图 6. 三维PCA算法思想图(三)
如图6所示便是上面三维样本点在二维平面上的投影结果。
以上就是整个PCA降维算法的核心思想,总结起来就是对于n维特征数据来说,可以通过PCA算法找到其对应的
个主要成分,然后根据需要选择前
个最重要的成分,最后再将原始数据投影到由这
个主要成分所构成的
维空间中便达到了降维的目的。
2.2 算法原理
通过第2.1小节内容的介绍相信大家对于PCA算法已经有了一个感性的认识,那么应该如何建模PCA算法并进行求解呢?根据PCA算法的思想可知,为了能使得降维后样本点之间的间距尽可能大,那么在降维时就应该选择前
个方差较大的维度作为主成分进行投影。同时,为了方便后续推导,需要先对原始特征维度进行去均值的标准化处理,使得每个维度的均值为0方差为1。
图 7. 二维PCA原理图
如图7所示,在二维平面上“十”字为原始样本点,圆点为原始样本降维后的投影点,
为投影方向所在的单位方向向量,原始样本与投影方向的夹角为
。此时,对于任意原始样本点
来说,其投影点到原点的距离为
注:
和
均为列向量。
进一步,为了使得降维后所有投影点的整体方差最大,则只需要最大化式
即可
其中
表示第
个样本,
表示样本总数。
同理,对于三维空间中的样本点来说,其投影后的结果如图8所示。
图 8. 三维PCA原理图
如图8所示,在三维空间空十字表示原始样本点,黑色圆点表示降维后的投影点,
为构成投影平面的一组正交单位向量,
为原点指向投影点的方向向量,原始样本与投影面的夹角为
。此时,对于任意原始样本点
来说,其投影点到原点的距离为
又因为
,所以有
进一步,为了使得降维后所有投影点的整体方差最大,则只需要最大化式
即可
其中
表示第
个样本,
表示样本总数。
最后,通过前面介绍的拉格朗日乘数法便可以求得对应的投影平面。
所有完整代码(包括图示)均可从本仓库获取:https://github.com/moon-hotel/MachineLearningWithMe
2.3 投影示例
假如,现在某数据集已经求解得到了对应的
个主要成分,那应该怎么完成降维呢?换句话说应该如何将原始的样本点投影到新的低维空间中呢?
我们知道在平面直角坐标系中通常会选择
这两个正交单位向量作为基向量来对平面中的所有点进行表示,如图9所示。
图 9. 二维平面坐标表示图
在图9中,向量
的含义便是在方向
上移动
个单位,在方向
上移动
个单位。不过这样可能感观并不明显,下面旋转一下坐标系。
图 10. 平面坐标旋转图
如图10所示,此时选取来作为基向量,那么
坐标系中的样本点
在
所表示的坐标系中是多少呢?答案便是:先在
方向移动
的长度;然后在
方向移动
的长度。所以,在新的坐标系下样本点
的坐标为:
所以在PCA中,降维(更换坐标系)之后的新坐标计算公式为
其中
,
是表示前
个主要成分的列向量,
表示原始第
个样本的表示,
表示样本
降维后的表示。
到此,PCA算法的主要原理就介绍完了,下面来看如何在sklearn中使用PCA模型。
2.3 PCA示例代码
在sklearn中,可以通过中的模块来完成整个建模过程。下面掌柜以iris数据集在决策树上的分类为例,分别展示降维前和降维后分类模型的效果。
首先是载入数据集,代码如下:
在上述代码中,第1行是导入模块;第5行中表示降维的维度。第6-8行是载入原始数据集,并分割成训练集和测试集;第9-12行是根据条件判断是否对数据进行降维,同时需要注意的是在训练集上使用的是方法(即先再),而在测试集上则是直接使用在训练集上得到的参数(投影平面)进行降维;第13行是返回训练集和测试集。
接着分别用降维前和降维后的数据集来进行分类和测试,代码如下:
上述代码运行后会出现类似如下的结果:
在运行上述代码多次后发现,在大多数情况下降维后的准确率都会好于没有降维时的准确率,这可能是因为在原始的4个特征中本来就有特征是冗余的,在决策树的建模过程中反而会影响节点的分裂方式。
3 PCA求解
在介绍完PCA算法的思想及原理后接下来我们继续来看目标函数的求解过程。
3.1 投影平面求解
根据第2.2节的内容可知,在
维空间可以通过最大化投影点与原点的方差来求得最佳的投影维度,即
其中
为单位向量。
进一步,根据式
可以构造得到如下拉格朗日函数
对
求偏导并令其为
有
其中
是一个对称矩阵,也称之为协方差矩阵(Covariance Matrix)。
最终,可以求得满足等式
的解为
对应的
个特征向量
和
对应的
个特征值
,其中
。
又因为投影点到原点的距离为
,所以上述解中
越大,其对应特征向量作为投影维度时投影点到原点的方差便越大。此时可以得出一个重要的结论便是,对于原始
维样本空间来说其必定存在
个相互正交(在实对称矩阵中不同特征值对应的特征向量正交)的特征向量,且特征值最大的特征向量便是使得投影点与原点方差最大的投影维度。
对于高维空间中的样本点来说,根据上述步骤便可以求得最佳的投影维度。但是通常我们并不会将高维空间中的样本直接投影到一个维度上,而是寻找对应的低维空间进行投影。因此可以选择前
个最大的特征值对应的特征向量来作为投影平面进行投影,因为此时所有投影点与原点之间的方差最大。
假设某数据集有
个特征维度,
是根据上述步骤求得的
个单位特征向量,
为对应的特征值,现需要将其降维到
维空间中。根据式
可知,此时对于任意样本点
来说,其投影点到原点的距离为
其中
为原点指向投影点的方向向量,且一定存在一个
使得
,因此式
可进一步写为
继续,投影点与原点之间的方差为
由此,根据式
的结果可知,若要式
取最大值,则
必须是
中前
个最大的特征值所对应的特征向量
最后,对于PCA算法的求解过程可总结为如下四步:
第一步:根据原始
维特征数据集
进行标准化处理,并同时求解协方差矩阵
;
第二步:求解
的对应的特征值
和特征向量
,其中
;
第三步:将特征向量以对应特征值大小递减的方式进行排序,并根据需要取前
个特征向量,其中
;
第四步:将原始样本投影到新的特征空间
到此,对于PCA算法的整个原理求解部分就介绍完了,下面再来看如何实现PCA算法。
3.2 PCA实现
根据第3.1节PCA原理可知,首先需要根据原始数据集构造协方差矩阵并计算得到对应的特征值和特征向量。在这里,可以借助中的模块来完成特征值和特征向量的求解。
所有完整代码(包括图示)均可从本仓库获取:https://github.com/moon-hotel/MachineLearningWithMe
(1)特征值特征向量求解
首先,定义对应的类和初始化方法,代码如下:
在上述代码中,第4行表示降维的维度,即上文中的值。
进一步,实现特征值和特征向量的计算过程,代码如下:
在上述代码中,第2-3行是对训练集进行标准化处理;第5行是构造协方差矩阵并求得其对应的特征值和特征向量;第7-9行是根据特征值的大小对特征值和特征向量进行排序处理,同时取前个主要成分。
(2)数据投影降维
在计算得到投影空间后,便可以对原始数据集进行降维处理,代码如下:
在上述代码中,第3行便是对原始样本进行降维处理;第5-7行是实现的一个快捷版本,即同时完成投影空间的计算和降维。对于初学者来说这里尤其要提到的一点是,这个方法其实相当于是计算模型参数的过程,因此需要在训练集上完成;而在测试集上直接使用方法根据训练集中计算得到的投影空间直接降维即可(在sklearn中,所有涉及有方法的模型都是这样的用法),而不必再次进行操作。
在实现完整个降维过程后, 便可以通过如下所示的代码来进行测试。为了对比,首先需要实现两种方式下的降维处理,代码如如下:
在上述代码中,第5-8行是根据参数选择采用sklearn中的模块进行降维处理还是选择使用上述模块进行降维处理。
进一步,对降维后的数据在决策树上进行效果测试,代码如下:
在上述代码中,第2-7行是采用模块进行降维后在决策树上进行的分类示例;第9-14行是在sklearn中模型上进行降维后在决策树种的分类示例。上述代码运行结束后将会看到类似如下所示的结果:
从上述结果可以看出,使用和模块降维后在决策树上的测试结果保持了一致。
4 总结
在这篇文章中,掌柜首先从直观层面解释了PCA算法的基本思想以及通过两个图示介绍了降维的大致过程;然后详细介绍了PCA算法的基本原理,通过一个实际的示例介绍了降维的计算过程,并介绍了如何在sklearn中来使用PCA模块;进一步,掌柜详细阐述了如何通过拉格朗日乘数法来求解PCA中的目标函数以及投影平面的求解过程;最后,借助于numpy中的特征值特征向量求解函数动手实现了整个PCA的降维过程。
本次内容就到此结束,感谢您的阅读!如果你觉得上述内容对你有所帮助,欢迎帮忙点赞分享!青山不改,绿水长流,我们月来客栈见!
引用
[1] https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
[2] https://ourarchive.otago.ac.nz/bitstream/handle/10523/7534/OUCS-2002-12.pdf
[3] https://jakevdp.github.io/PythonDataScienceHandbook/05.09-principal-component-analysis.html
[4] Andrew Ng, Machine Learning, Stanford University, CS229, Spring 2019.
[5] 代码仓库:https://github.com/moon-hotel/MachineLearningWithMe
领取专属 10元无门槛券
私享最新 技术干货