首页 > 分享 > 【特征选择与降维】主成分分析 PCA

【特征选择与降维】主成分分析 PCA

机器学习特征选择与降维:主成分分析 PCA(超通俗完整版)

在机器学习中,我们经常遇到特征太多、维度太高的问题:计算慢、冗余强、容易过拟合。主成分分析(PCA)就是最经典、最常用的无监督降维 + 特征去冗余方法。

这篇文章用大白话 + 公式详解 + 实战代码 + 面试总结,从原理到落地讲透 PCA,本科生、研究生都能轻松看懂。

一、先搞懂:为什么要用 PCA?

1. 现实痛点 特征成百上千,训练极慢很多特征高度相关(比如“身高”和“腿长”)维度灾难导致模型过拟合高维数据无法画图可视化 2. PCA 到底在做什么?

一句话:
把很多相关的原始特征,压缩成少数几个不相关的“综合新特征”,同时保留最多的数据信息。

举个例子:
你要评价一个苹果,有重量、大小、直径、周长、甜度、酸度……
PCA 会帮你合成1~2个综合指标,比如“综合品质”“口感差异”,用这两个指标就能代表原来所有特征。

二、PCA 核心思想(超通俗)

PCA 的目标只有一个:
在降维的同时,让数据投影后的差异(方差)最大。

方差越大 → 信息保留越多方差越小 → 信息丢失越多主成分之间互相正交、完全不相关

三、PCA 数学原理(一步步讲清楚)

1. 步骤总览 数据标准化(必须做!)计算协方差矩阵(看特征相关性)对协方差矩阵做特征值分解按特征值从大到小选前 k 个主成分投影得到低维数据 2. 步骤1: 数据标准化 (最关键!)

PCA 非常依赖方差大小,如果特征单位不一样(比如米、厘米、千克),结果会完全跑偏。

做法:
把每个特征变成 均值=0,方差=1
xnew=x−μσx_{new} = frac{x - mu}{sigma}xnew​=σx−μ​

作用:

消除量纲影响让所有特征同等重要 3. 步骤2:计算协方差矩阵

协方差矩阵用来衡量特征之间的线性相关程度

设标准化后数据为 X~∈Rn×dtilde{X} in mathbb{R}^{n×d}X~∈Rn×d
协方差矩阵:
C=1n−1X~TX~C = frac{1}{n-1} tilde{X}^T tilde{X}C=n−11​X~TX~

维度:d×d(d 是特征数)对角线:每个特征自己的方差非对角线:两个特征的相关程度 4. 步骤3:特征值分解(PCA 灵魂)

我们要找一个方向 www,让数据投影后方差最大。
最终会推导出:
Cw=λwC w = lambda wCw=λw

这就是特征值方程

λlambdaλ:特征值 → 代表该方向的方差大小www:特征向量 → 代表主成分方向

规则:
特征值越大 → 该主成分保留信息越多

5. 步骤4:选择前 k 个主成分

按特征值从大到小排序,选前 k 个特征向量组成变换矩阵 WkW_kWk​。

怎么选 k?用累计方差贡献率
贡献率=∑i=1kλi∑j=1dλj贡献率 = frac{sum_{i=1}^k lambda_i}{sum_{j=1}^d lambda_j}贡献率=∑j=1d​λj​∑i=1k​λi​​

通用标准:

保留 90%~95% 信息即可画图、可视化一般选 k=2 或 k=3 6. 步骤5:数据投影(降维完成)

Z=X~⋅WkZ = tilde{X} cdot W_kZ=X~⋅Wk​

Z:降维后的数据(n×k)每行一个样本,每列一个主成分

四、PCA 完整 算法 流程(背诵版)

对数据标准化(零均值、单位方差)计算协方差矩阵求协方差矩阵的特征值与特征向量按特征值从大到小排序取前 k 个特征向量构成投影矩阵将原始数据投影,得到低维表示

五、实战案例: 鸢尾花 PCA 降维(可直接运行)

1. 数据集 说明 4个特征:花萼长/宽、花瓣长/宽3类花目标:把 4 维降到 2 维,可视化 + 分类 2. 完整 Python 代码

# 1. 导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 2. 加载数据 iris = load_iris() X = iris.data y = iris.target feature_names = iris.feature_names print("数据形状:", X.shape) print("特征名:", feature_names) # 3. 标准化(必须!) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 4. PCA 训练(先看全部主成分) pca_all = PCA(n_components=4) pca_all.fit(X_scaled) # 5. 查看方差贡献率 print("各主成分方差贡献率:", pca_all.explained_variance_ratio_) print("累计贡献率:", np.cumsum(pca_all.explained_variance_ratio_)) # 6. 降到2维并可视化 pca_2d = PCA(n_components=2) X_pca_2d = pca_2d.fit_transform(X_scaled) plt.figure(figsize=(8,6)) for label in np.unique(y): plt.scatter(X_pca_2d[y==label,0], X_pca_2d[y==label,1], label=iris.target_names[label]) plt.xlabel("主成分1") plt.ylabel("主成分2") plt.title("鸢尾花 PCA 2D 可视化") plt.legend() plt.grid(True) plt.show() # 7. 绘制累计方差贡献率曲线 plt.figure(figsize=(6,4)) plt.plot(range(1,5), np.cumsum(pca_all.explained_variance_ratio_), marker='o') plt.xlabel("主成分个数") plt.ylabel("累计方差贡献率") plt.title("累计方差贡献率") plt.grid(True) plt.show() # 8. 对比:原始特征 vs PCA 降维分类效果 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42) # 原始4维 model_raw = LogisticRegression(max_iter=200) model_raw.fit(X_train, y_train) acc_raw = accuracy_score(y_test, model_raw.predict(X_test)) # PCA 2维 X_train_pca = pca_2d.fit_transform(X_train) X_test_pca = pca_2d.transform(X_test) model_pca = LogisticRegression(max_iter=200) model_pca.fit(X_train_pca, y_train) acc_pca = accuracy_score(y_test, model_pca.predict(X_test_pca)) print(f"原始4维准确率: {acc_raw:.4f}") print(f"PCA 2维准确率: {acc_pca:.4f}")

python

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 3. 结果说明 前2个主成分通常能保留 95%+ 信息降维后分类准确率几乎不变画图清晰可分,非常适合探索性分析

六、PCA 优点与缺点(面试高频)

✅ 优点 无监督,不需要标签强力去冗余、消除多重共线性大幅降维、提速、防过拟合支持高维数据可视化(2D/3D)数学严谨、实现简单、通用性极强 ❌ 缺点 主成分难以解释物理意义不利用标签信息,可能丢失对分类有用信息对异常值敏感只能做线性变换,非线性数据效果差是特征变换,不是传统特征选择

七、PCA 与常见特征选择/降维方法对比

方法类型监督可解释生成新特征处理共线性非线性PCA投影降维否差是强弱方差选择过滤否好否弱弱RFE包装是很好否中弱Lasso嵌入是很好否强弱随机森林重要性嵌入是好否中中Kernel PCA核降维否很差是强强t-SNE/UMAP流形否差是中强

八、什么时候用 PCA?什么时候不用?

✅ 推荐用 PCA 特征高维、冗余、强相关无标签数据、聚类、可视化、数据探索需要降维提速,作为模型预处理高维小样本(如基因、文本、图像) ❌ 不推荐用 PCA 要求可解释原始特征数据有强非线性结构需要监督信息做特征选择对异常值非常敏感的任务

九、使用 PCA 必知技巧

必须标准化,否则结果完全跑偏用累计方差贡献率选 k高维数据优先用 SVD 版本 PCA(更快更稳)异常值要提前处理分类任务可先用 PCA 再用 LDA 效果更好

十、总结(一句话记住 PCA)

PCA 是无监督线性降维,通过最大化方差保留信息,把高维相关特征变成低维不相关主成分,实现去冗余、提速、可视化,是机器学习最基础也最实用的特征处理工具。

相关知识

【特征选择与降维】主成分分析 PCA
PCA主成分分析去噪与降维
基于PCA与LDA的数据降维实践
主成分分析:PCA的思想及鸢尾花实例实现
机器学习(三)降维之PCA及鸢尾花降维
人工智能算法原理与代码实战:特征选择与降维的技术 2
PCA实现鸢尾花数据集降维可视化
使用PCA对Iris数据集进行降维和二维分类显示
使用pca的降维方法对sklearn官方iris(鸢尾花)数据集进行降维,并绘图显示
机器学习利用PCA完成鸢尾花数据集的降维与分类

网址: 【特征选择与降维】主成分分析 PCA https://m.huajiangbk.com/newsview2587100.html

所属分类:花卉
上一篇: 邮储银行亳州市分行举办“魅力女神
下一篇: 2026年花艺师实操考试试卷答案