简介
主成分分析(Principal Component Analysis,PCA)是一种用于降低数据集维度,同时保留其大部分原始变化的技术。然而,PCA 是一种线性方法,当数据具有非线性结构时可能效果不佳。在这种情况下,可以使用核主成分分析(Kernel PCA)代替 PCA。在本实验中,我们将展示 PCA 和核主成分分析之间的差异以及如何使用它们。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”(Notebook)标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
加载数据集
我们将使用 sklearn.datasets 中的 make_circles 函数创建一个由两个嵌套圆圈组成的数据集。
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
X, y = make_circles(n_samples=1_000, factor=0.3, noise=0.05, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
可视化数据集
我们将使用 matplotlib 绘制生成的数据集,以可视化该数据集。
import matplotlib.pyplot as plt
_, (train_ax, test_ax) = plt.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4))
train_ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
train_ax.set_ylabel("Feature #1")
train_ax.set_xlabel("Feature #0")
train_ax.set_title("Training data")
test_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
test_ax.set_xlabel("Feature #0")
_ = test_ax.set_title("Testing data")
使用主成分分析(PCA)对数据集进行投影
主成分分析(PCA)用于将数据集投影到一个新的空间,该空间保留了其大部分原始变化。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_test_pca = pca.fit(X_train).transform(X_test)
使用核主成分分析(Kernel PCA)对数据集进行投影
核主成分分析(Kernel PCA)用于将数据集投影到一个新的空间,该空间不仅保留了其大部分原始变化,还能处理非线性结构。
from sklearn.decomposition import KernelPCA
kernel_pca = KernelPCA(
n_components=None, kernel="rbf", gamma=10, fit_inverse_transform=True, alpha=0.1
)
X_test_kernel_pca = kernel_pca.fit(X_train).transform(X_test)
可视化主成分分析(PCA)和核主成分分析(Kernel PCA)的投影
我们将绘制主成分分析(PCA)和核主成分分析(Kernel PCA)的投影,以直观展示它们之间的差异。
fig, (orig_data_ax, pca_proj_ax, kernel_pca_proj_ax) = plt.subplots(
ncols=3, figsize=(14, 4)
)
orig_data_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
orig_data_ax.set_ylabel("Feature #1")
orig_data_ax.set_xlabel("Feature #0")
orig_data_ax.set_title("Testing data")
pca_proj_ax.scatter(X_test_pca[:, 0], X_test_pca[:, 1], c=y_test)
pca_proj_ax.set_ylabel("Principal component #1")
pca_proj_ax.set_xlabel("Principal component #0")
pca_proj_ax.set_title("Projection of testing data\n using PCA")
kernel_pca_proj_ax.scatter(X_test_kernel_pca[:, 0], X_test_kernel_pca[:, 1], c=y_test)
kernel_pca_proj_ax.set_ylabel("Principal component #1")
kernel_pca_proj_ax.set_xlabel("Principal component #0")
_ = kernel_pca_proj_ax.set_title("Projection of testing data\n using KernelPCA")
将核主成分分析(Kernel PCA)投影反向投影到原始空间
我们将使用核主成分分析(Kernel PCA)的inverse_transform方法,将核主成分分析(Kernel PCA)的投影反向投影到原始空间。
X_reconstructed_kernel_pca = kernel_pca.inverse_transform(kernel_pca.transform(X_test))
可视化重构后的数据集
我们将绘制原始数据集和重构后的数据集以进行比较。
fig, (orig_data_ax, pca_back_proj_ax, kernel_pca_back_proj_ax) = plt.subplots(
ncols=3, sharex=True, sharey=True, figsize=(13, 4)
)
orig_data_ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test)
orig_data_ax.set_ylabel("Feature #1")
orig_data_ax.set_xlabel("Feature #0")
orig_data_ax.set_title("Original test data")
pca_back_proj_ax.scatter(X_reconstructed_pca[:, 0], X_reconstructed_pca[:, 1], c=y_test)
pca_back_proj_ax.set_xlabel("Feature #0")
pca_back_proj_ax.set_title("Reconstruction via PCA")
kernel_pca_back_proj_ax.scatter(
X_reconstructed_kernel_pca[:, 0], X_reconstructed_kernel_pca[:, 1], c=y_test
)
kernel_pca_back_proj_ax.set_xlabel("Feature #0")
_ = kernel_pca_back_proj_ax.set_title("Reconstruction via KernelPCA")
总结
在本实验中,我们了解了主成分分析(PCA)和核主成分分析(Kernel PCA)之间的差异。我们使用主成分分析(PCA)和核主成分分析(Kernel PCA)将一个数据集投影到一个新的空间,并对投影进行了可视化。我们还使用核主成分分析(Kernel PCA)将投影反向投影到原始空间,并将其与原始数据集进行了比较。