使用核主成分分析的主成分分析

Beginner

This tutorial is from open-source community. Access the source code

简介

主成分分析(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)将投影反向投影到原始空间,并将其与原始数据集进行了比较。