python-machine-learning-book-2nd-edition降维技术:PCA与t-SNE可视化
在处理高维数据时,我们常常面临维度灾难问题——数据维度增加导致计算复杂度上升、模型泛化能力下降。降维技术通过保留关键信息将高维数据映射到低维空间,既简化分析又保留数据本质特征。本文以python-machine-learning-book-2nd-edition项目为基础,详解主成分分析(PCA)与t分布随机邻域嵌入(t-SNE)两种核心降维技术的原理与实践,帮助读者快速掌握高维数据可视化方法。
PCA:线性降维的数学原理与实现
主成分分析(PCA,Principal Component Analysis)是最常用的线性降维方法,通过正交变换将高维特征映射到低维空间,最大化数据方差。其核心思想是找到数据中方差最大的方向(主成分),依次构建低维坐标系。
PCA算法步骤与关键公式
-
数据标准化:将特征缩放到均值为0、方差为1的标准正态分布,避免量纲影响。
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train_std = sc.fit_transform(X_train) # [code/ch05/ch05.py](https://link.gitcode.com/i/bc1a1a60602e7271111f9a221c9f6a69) -
协方差矩阵计算:协方差矩阵反映特征间线性关系,公式为 $C = \frac{1}{n-1}X^TX$。
cov_mat = np.cov(X_train_std.T) # [code/ch05/ch05.py](https://link.gitcode.com/i/4d030e9962fefd7c564cf70442173c9e) -
特征值分解:对协方差矩阵进行特征值分解,得到特征值(方差贡献)与特征向量(主成分方向)。
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat) # [code/ch05/ch05.py](https://link.gitcode.com/i/ab741744ab0f6eefcf1157253e1e9b9e) -
主成分选择:按特征值排序,选择前k个主成分,保留累计方差贡献率(通常>85%)。

上图展示了葡萄酒数据集(wine.data)的主成分方差分布,前2个主成分累计贡献~60%方差,可有效降维。
-
数据映射:通过主成分矩阵将数据投影到低维空间:$X_{pca} = X \cdot W$,其中W为top-k特征向量构成的投影矩阵。
# 构建投影矩阵W(取前2个主成分) w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis])) # [code/ch05/ch05.py](https://link.gitcode.com/i/3b79ddc3d94b0f7d159bc81399fc3418) X_train_pca = X_train_std.dot(w) # 投影到2D空间
scikit-learn PCA实战与可视化
使用scikit-learn的PCA类可快速实现降维,以葡萄酒数据集分类为例:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_std) # [code/ch05/ch05.py](https://link.gitcode.com/i/a9bc7737d64436ba2180c4e6f320bb9b)
# 逻辑回归分类
lr = LogisticRegression()
lr.fit(X_train_pca, y_train) # [code/ch05/ch05.py](https://link.gitcode.com/i/faa56c6bcd5bffc19beef095a1656c5d)
上图为训练集投影结果(code/ch05/images/05_04.png),测试集分类准确率达97%(code/ch05/ch05.py)。
t-SNE:非线性数据的流形学习
t-SNE(t-Distributed Stochastic Neighbor Embedding)通过保留局部邻域关系实现非线性降维,适用于高维数据可视化(如文本、图像)。与PCA不同,t-SNE不追求方差最大化,而是通过学生t分布刻画低维空间相似度。
t-SNE核心思想
-
高维空间相似度:用高斯分布$p_{j|i} = \frac{\exp(-|x_i-x_j|^2/(2\sigma_i^2))}{\sum_{k\neq i}\exp(-|x_i-x_k|^2/(2\sigma_i^2))}$描述样本对相似度。
-
低维空间相似度:用学生t分布$q_{ij} = \frac{(1+|y_i-y_j|^2)^{-1}}{\sum_{k\neq l}(1+|y_k-y_l|^2)^{-1}}$保留局部结构。
-
优化目标:最小化KL散度$KL(P|Q) = \sum_i\sum_jp_{ij}\log\frac{p_{ij}}{q_{ij}}$。
代码实现与对比
以半月形数据集为例,对比PCA与t-SNE降维效果:
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, random_state=123)
X_tsne = tsne.fit_transform(X) # X为原始高维数据
左图为PCA降维结果(code/ch05/images/05_13.png),半月形数据未分离;右图为t-SNE结果(code/ch05/images/05_14.png),非线性结构被保留。
降维技术选型指南
| 技术 | 原理 | 优势 | 局限 | 适用场景 |
|---|---|---|---|---|
| PCA | 线性投影,方差最大化 | 速度快,可解释性强 | 无法处理非线性关系 | 特征去噪、数据压缩 |
| t-SNE | 非线性流形,保留局部结构 | 可视化效果好 | 计算量大,不适合大数据 | 高维数据可视化(如MNIST、文本嵌入) |
更多降维方法(如LDA、核PCA)可参考官方文档,其中核PCA通过核函数(RBF、多项式)将非线性数据映射到高维后再降维,适用于同心圆等复杂分布(code/ch05/images/05_17.png)。
总结与实践建议
- 预处理优先:降维前需标准化数据(code/ch05/ch05.py),异常值会严重影响PCA结果。
- 维度选择:通过方差贡献率(PCA)或 perplexity参数(t-SNE,通常5-50)调整维度。
- 可视化工具:结合matplotlib绘制散点图(code/ch05/ch05.py),或使用seaborn添加分类标签。
- 代码复用:项目提供完整案例,包括数据集(wine.data)、PCA实现(ch05.py)及Jupyter教程(ch05.ipynb)。
通过合理选择降维技术,可显著提升模型训练效率(如SVM、神经网络)并揭示数据内在结构,为后续分析奠定基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



