降维技术详解与实战:PCA与t SNE(十九)

在数据科学领域,我们经常遇到高维数据集,这些数据集包含了大量特征。然而,过多的特征不仅会导致计算资源的浪费,还会引发“维度灾难”,使得模型性能下降。降维技术正是解决这一问题的有效手段。本文将详细介绍降维的基本概念、主流算法、应用场景以及如何选择合适的降维方法。通过实例和代码示例,帮助你更好地理解和应用降维技术。

降维的基本概念

什么是降维?

降维是指将高维数据集转换为低维数据集的过程,同时尽量保留原始数据的重要信息。这一过程可以通过数学变换实现,将数据从高维空间映射到低维空间。

为什么要降维?

降维的主要目的是:

  1. 可视化:将高维数据降维到2D或3D,便于我们直观地观察数据的结构和分布。
  2. 提升效率:减少数据维度可以显著降低存储空间需求,加快模型训练速度,降低计算成本。
  3. 去除噪声与冗余:许多特征可能是冗余或无关的,降维可以帮助我们去除这些噪声,提高模型的泛化能力。
  4. 缓解维度灾难:在高维空间中,数据点容易变得稀疏,导致模型难以捕捉到有效的模式。降维可以缓解这一问题。

核心思想:信息保留

降维的关键在于如何在降低维度的同时,最大限度地保留原始数据的重要信息。不同的降维算法通过不同的方法实现这一点。

主流降维算法详解

线性降维:主成分分析(PCA)

主成分分析(PCA)是最常用的线性降维方法之一。它的目标是找到一组新的坐标轴(主成分),使得数据在这组新轴上的投影方差最大。

PCA的工作原理

  1. 中心化:将每个特征减去其平均值,使数据分布的中心移动到坐标原点。
  2. 计算协方差矩阵:协方差矩阵描述了数据各个特征之间的相关性。
  3. 特征值分解:计算协方差矩阵的特征值和特征向量。特征向量指明了新坐标轴(主成分)的方向,特征值则代表了数据在该方向上的方差大小。
  4. 选择主成分:将特征值从大到小排序,选择前 k 个最大的特征值对应的特征向量,构成一个投影矩阵。
  5. 数据转换:将原始数据乘以这个投影矩阵,得到降维到 k 维的新数据。

PCA的优缺点

  • 优点:计算高效,原理清晰,能有效去除线性相关性。
  • 缺点:PCA是一种线性方法,假设数据的主成分是线性的。对于非线性数据,PCA的效果可能不佳。

非线性降维:t-分布随机邻域嵌入(t-SNE)

t-分布随机邻域嵌入(t-SNE)是一种流行的非线性降维方法,特别适用于数据可视化。它的核心思想是保留数据的局部结构,使得在高维空间中相似的点在低维空间中仍然相似。

t-SNE的工作原理

  1. 计算高维空间中的相似度:通过高斯分布计算每个点与其他点的相似度。
  2. 计算低维空间中的相似度:通过t分布计算每个点在低维空间中的相似度。
  3. 优化低维空间中的布局:通过梯度下降法最小化高维和低维空间相似度之间的差异。

t-SNE的优缺点

  • 优点:对复杂非线性数据的可视化效果极佳,能清晰展现聚类结构。
  • 缺点
    • 计算速度慢,不适合大数据集。
    • 结果具有随机性,每次运行可能略有不同。
    • 超参数敏感,需要通过实验调整。
    • 主要用于可视化,降维后的特征通常不用于后续的机器学习任务。

实例:瑞士卷数据降维

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.datasets import make_swiss_roll

plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'PingFang SC', 'Heiti TC', 'WenQuanYi Micro Hei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

X_swiss, color = make_swiss_roll(n_samples=1000, noise=0.1)
print(f"瑞士卷数据形状: {X_swiss.shape}")

pca = PCA(n_components=2)
X_swiss_pca = pca.fit_transform(X_swiss)

tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_swiss_tsne = tsne.fit_transform(X_swiss)

fig, axes = plt.subplots(1, 2, figsize=(15, 6))

axes[0].scatter(X_swiss_pca[:, 0], X_swiss_pca[:, 1], c=color, cmap='viridis')
axes[0].set_title('PCA降维结果')
axes[0].set_xlabel('PC1')
axes[0].set_ylabel('PC2')

sc = axes[1].scatter(X_swiss_tsne[:, 0], X_swiss_tsne[:, 1], c=color, cmap='viridis')
axes[1].set_title('t-SNE降维结果 (perplexity=30)')
axes[1].set_xlabel('t-SNE 1')
axes[1].set_ylabel('t-SNE 2')

plt.colorbar(sc, ax=axes[1], label='瑞士卷的"高度"')
plt.tight_layout()
plt.show()

代码解读

  • perplexity 参数:控制每个点考虑的近邻数量。值小则更关注局部结构,值大则更关注全局结构。
  • random_state:确保结果可复现,因为t-SNE的优化过程是随机的。
  • 从可视化结果可以看出,PCA将瑞士卷“压扁”了,丢失了其非线性卷曲结构;而t-SNE则更好地在二维平面上展开了这个卷,保留了数据的局部邻接关系。

如何选择降维方法与关键参数

算法选择流程

  1. 明确目标:是为了可视化,还是为了给下游模型输入更精炼的特征?
  2. 数据探索:先可视化部分数据,对其线性/非线性有个初步感觉。
  3. 方法实验:根据目标和数据结构选择算法,并调整关键参数。
  4. 评估结果:通过可视化、信息保留率或下游任务性能来评估降维效果。

关键参数指南

PCA: n_components

  • 可以设为整数(如2),指定具体维度。

  • 可以设为 0 < n < 1 的小数(如0.95),表示保留累计方差贡献率达到该阈值所需的最少主成分。

pca = PCA(n_components=0.95)
pca.fit(X)
print(f"为保留95%方差,需要 {pca.n_components_} 个主成分")

t-SNE: perplexity

  • 典型值在5到50之间。
  • 对于小数据集(<100样本),建议使用更小的值。
  • 最佳值通常接近数据中每个点的“近邻”数量。需要通过实验观察可视化效果来选择。

实践练习:MNIST手写数字数据集降维

from sklearn.datasets import fetch_openml
from sklearn.preprocessing import StandardScaler

mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X_mnist, y_mnist = mnist.data[:3000] / 255.0, mnist.target[:3000]
print(f"MNIST数据形状: {X_mnist.shape}")

pca = PCA(n_components=50)
X_mnist_pca = pca.fit_transform(X_mnist)
print(f"PCA后形状: {X_mnist_pca.shape}")

tsne = TSNE(n_components=2, perplexity=40, n_iter=300, random_state=42)
X_mnist_tsne = tsne.fit_transform(X_mnist_pca)

plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_mnist_tsne[:, 0], X_mnist_tsne[:, 1], c=y_mnist.astype(int), cmap='tab10', alpha=0.6, s=5)
plt.colorbar(scatter, ticks=range(10), label='手写数字')
plt.title('MNIST手写数字数据集经PCA预处理后的t-SNE可视化')
plt.xlabel('t-SNE 1')
plt.ylabel('t-SNE 2')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

练习目标

观察不同数字(0-9)是否在二维平面上形成了清晰的簇。尝试修改 perplexity 参数(如改为10或50),看看可视化效果如何变化。

总结与核心要点

降维技术是数据科学中的重要工具,它通过减少数据维度来提高计算效率、去除噪声、缓解维度灾难,并且能够帮助我们更好地理解数据的结构。PCA和t-SNE是两种常用的降维方法,各有优缺点。选择合适的降维方法需要根据具体的应用场景和数据特性进行综合考虑。

  • PCA:适用于线性数据,计算高效,适合预处理和去除线性相关。
  • t-SNE:适用于非线性数据,可视化效果极佳,但计算较慢,结果具有随机性。

通过本文的学习,希望你能够掌握降维的基本概念和技术,为后续的数据分析和机器学习任务打下坚实的基础。降维不仅是数据预处理的一部分,更是探索高维数据结构的一把关键钥匙。