1.KPCA原理:
主成分分析(PCA)是使用线性映射将数据进行降维,但是通常情况下高维到低维是非线性的,往往达不到我们预期的结果。核主成分分析(KPCA)将原始数据通过选择适当的核函数(Kernel)映射到高维空间,再利用高维度空间进行线性降维,是一种用于非线性分类的降维工具。因此 KPCA的核心就是核函数。同时,KPCA采用了比较复杂的非线性映射,提高了非线性数据的处理效率。
原理图解析:KPCA空间中的数据是通过将输入空间的非线性数据选择合适的核函数映射到高维特征空间,然后对其进行PCA线性降维处理。
Pre-image注解:将得到的KPCA空间中的预测数据与原始数据进行比较,看其特征信息的损失大小(越小越好);
Reconstruction注解:与Pre-image作用类似。
2、算法流程
第一步:利用核函数把原始数据集映射到高维空间,得到高维空间的数据矩阵。
第二步:由于协方差矩阵表征了变量之间的相关程度(即维度之间的关系),所以我们通过计算高维空间中数据的协方差矩阵来进一步计算特征值与特征向量(参考PCA)。
第三步:将高维特征空间的投影向量使用高维样本点线性表示。
根据定理:空间中的任一向量,都可以由该空间中的所有样本线性表示:
因此可用所有样本表示特征向量,即:
将这个线性组合代回到特征向量公式,替换特征向量,得到:
等式两边同时左乘 φ(X)的转置,得到:
第四步:计算核矩阵K
上式中
表示核函数,即空间中任意一点到某一中心点的欧氏距离
第五步:求解矩阵K的特征值和特征向量,取前d个特征值对应的特征向量,以列向量组成向量矩阵,即为降维后数据集。
3、算法实例
以非线性可分数据集为例:
(1)采用PCA处理,代码如下:
# -*- coding:utf-8 -*-
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import numpy as np
x2, y2 = make_moons(n_samples=100, random_state=123)
if __name__ == '__main__':
pca = PCA(n_components=2)
x2_std = pca.fit_transform(x2)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14, 6))
ax[0].scatter(x2_std[y2==0, 0], x2_std[y2==0, 1], color='red', marker='^', alpha=0.5)
ax[0].scatter(x2_std[y2==1, 0], x2_std[y2==1, 1], color='blue', marker='o', alpha=0.5)
plt.scatter(x2_std[y2 == 0, 0], np.zeros((50, 1)) + 0.02, color='red', marker='^', alpha=0.5)
plt.scatter(x2_std[y2 == 1, 0], np.zeros((50, 1)) + 0.02, color='blue', marker='o', alpha=0.5)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
效果图如下:
(2)采用KPCA处理,代码如下:
# -*- coding:utf-8 -*-
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import numpy as np
x2, y2 = make_moons(n_samples=100, random_state=123)
if __name__ == '__main__':
kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)
x_kpca = kpca.fit_transform(x2)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14, 6))
ax[0].scatter(x_kpca[y2 == 0, 0], x_kpca[y2 == 0, 1], color='red', marker='^', alpha=0.5)
ax[0].scatter(x_kpca[y2 == 1, 0], x_kpca[y2 == 1, 1], color='blue', marker='o', alpha=0.5)
ax[1].scatter(x_kpca[y2 == 0, 0], np.zeros((50, 1)) + 0.02, color='red', marker='^', alpha=0.5)
ax[1].scatter(x_kpca[y2 == 1, 0], np.zeros((50, 1)) + 0.02, color='blue', marker='o', alpha=0.5)
ax[0].set_xlabel('PC1')
ax[0].set_ylabel('PC2')
ax[1].set_ylim([-1, 1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC1')
plt.show()
效果图如下:
结论:将非线性可分数据集分别采用PCA和KPCA进行降维分解,得到不同的效果。PCA分解不能够完全将数据集进行分类,分解效果并没有达到预期;而KPCA则实现的我们预想的效果,将数据集很好地分开来。
4、总结:
基于核的非线性降维方法——KPCA具有核方法的优点,但是核函数的选择则是尤为关键的,核选择的好坏决定了数据在高维空间计算的复杂与否。