主要成分分析:
是用于减少数据量的工具。它使我们能够在不损失大量信息的情况下减小数据量。 PCA通过找到方差最大的原始变量的一些正交线性组合(主要成分)来减小尺寸。
第一个主成分捕获数据中的大部分差异。第二个主成分与第一个主成分正交, 并捕获剩余的方差, 它是第一个主成分留下的, 依此类推。主成分与原始变量的数量一样多。
这些主要成分是不相关的, 并且按以下方式排序:前几个主要成分解释了原始数据的大部分差异。要了解有关PCA的更多信息, 请阅读文章
PCA是一种线性方法。也就是说, 它只能应用于线性可分离的数据集。对于线性可分离的数据集, 它表现出色。但是, 如果将其用于非线性数据集, 则可能得到的结果可能不是最佳降维。内核PCA使用内核函数将数据集投影到可线性分离的更高维度的特征空间中。它类似于支持向量机的思想。
有多种内核方法, 例如线性, 多项式和高斯方法。
代码如下:创建一个非线性的数据集, 然后将PCA应用于该数据集。
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
X, y = make_moons(n_samples = 500 , noise = 0.02 , random_state = 417 )
plt.scatter(X[:, 0 ], X[:, 1 ], c = y)
plt.show()
代码如下:让我们在此数据集上应用PCA
from sklearn.decomposition import PCA
pca = PCA(n_components = 2 )
X_pca = pca.fit_transform(X)
plt.title( "PCA" )
plt.scatter(X_pca[:, 0 ], X_pca[:, 1 ], c = y)
plt.xlabel( "Component 1" )
plt.ylabel( "Component 2" )
plt.show()
如你所见, PCA无法区分这两个类别。
代码如下:
在具有RBF内核且伽玛值为15的数据集上应用内核PCA。
from sklearn.decomposition import KernelPCA
kpca = KernelPCA(kernel = 'rbf' , gamma = 15 )
X_kpca = kpca.fit_transform(X)
plt.title( "Kernel PCA" )
plt.scatter(X_kpca[:, 0 ], X_kpca[:, 1 ], c = y)
plt.show()
在内核空间中, 这两类是线性可分离的。内核PCA使用内核函数将数据集投影到可线性分离的高维空间中。
最后, 我们使用scikit-learn将内核PCA应用于非线性数据集。
参考文献:
https://en.wikipedia.org/wiki/Kernel_principal_component_analysis
http://fourier.eng.hmc.edu/e161/lectures/kernelPCA/node4.html