在前面的小节中,我们讨论了核PCA相关的核心概念。现在根据之前总结过的实现核PCA方法的三个步骤,使用Python实现基于RBF核的PCA。借助于SciPy和NumPy的函数,我们将会看到,实现核PCA实际上很简单。
采用RBF核函数实现的PCA进行降维时存在一个问题,就是我们必须指定先验参数r需要通过实验来找到一个合适的r值,最好是通过参数调优算法来确定,例如网格搜索法,我们将在第6章中对其进行深入探讨。
1.示例一:分离半月形数据
现在,我们将实现的rbf_kernel_pca方法应用于非线性示例数据集。我们首先创建一个包含100个样本点的二维数据集,以两个半月形状表示:
出于演示的需要,使用三角符号标识的表示一个类别中的样本,使用圆形符号标识的表示另一类别的样本:
显然,这两个半月形不是线性可分的,而我们的目标是通过核PCA将这两个半月形数据展开,使得数据集成为适用于某一线性分类器的输入数据。首先,我们通过标准的PCA将数据映射到主成分上,并观察其形状:
很明显,经过标准PCA的转换后,线性分类器未必能很好地发挥其作用:
请注意,当我们仅绘制第一主成分的图像时(见右子图),我们分别将三角形和圆形代表的样本向上或向下做了轻微调整,以更好地展示类间重叠。
请注意,PCA是无监督方法,与LDA相比,它在使得方差最大化的过程中未使用类标信息。出于增强可视化效果的考虑,为了显示分类的程度,我们才在此使用了三角形和圆形符号。
现在我们将使用前一小节中实现的核PCA函数:rbf_kernel_pca:
可以看到,两个类别(圆形和三角形)此时是线性可分的,这使得转换后的数据适合作为线性分类器的训练数据集:
不过,对于可调整参数γ,没有一个通用的值使其适用于不同的数据集。针对给定问题找到一个适宜的参数值需要通过实验来解决。在第6章中,我们将讨论可自动进行参数优化等任务的技术。这里,我使用了一个已有的能够生成良好结果的值。
2.示例二:分离同心圆
在上一小节,我们演示了如何通过核PCA分离半月形数据。既然我们已经投入了如此多的精力去理解核PCA的概念,就再看一下另外一个关于非线性问题的有趣例子——同心圆。
代码如下:
同样,我们假设了一个涉及两个类别的问题,三角形和圆形分别标识不同类别的样本:
首先使用标准PCA方法,以便将其结果与基于RBF核的PCA生成的结果进行比较:
再一次发现,通过标准PCA无法得到适合于线性分类器的训练数据:
给定一个合适的γ值,来看看基于RBF的核PCA实现能否得到令人满意的结果:
基于RBF的核PCA再一次将数据映射到了一个新的子空间中,使两个类别变得线性可分: