在机器学习中,我们经常遇到特征太多、维度太高的问题:计算慢、冗余强、容易过拟合。主成分分析(PCA)就是最经典、最常用的无监督降维 + 特征去冗余方法。
这篇文章用大白话 + 公式详解 + 实战代码 + 面试总结,从原理到落地讲透 PCA,本科生、研究生都能轻松看懂。
一句话:
把很多相关的原始特征,压缩成少数几个不相关的“综合新特征”,同时保留最多的数据信息。
举个例子:
你要评价一个苹果,有重量、大小、直径、周长、甜度、酸度……
PCA 会帮你合成1~2个综合指标,比如“综合品质”“口感差异”,用这两个指标就能代表原来所有特征。
PCA 的目标只有一个:
在降维的同时,让数据投影后的差异(方差)最大。
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−11X~TX~
我们要找一个方向 www,让数据投影后方差最大。
最终会推导出:
Cw=λwC w = lambda wCw=λw
这就是特征值方程:
λlambdaλ:特征值 → 代表该方向的方差大小www:特征向量 → 代表主成分方向规则:
特征值越大 → 该主成分保留信息越多
按特征值从大到小排序,选前 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)每行一个样本,每列一个主成分# 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 是无监督线性降维,通过最大化方差保留信息,把高维相关特征变成低维不相关主成分,实现去冗余、提速、可视化,是机器学习最基础也最实用的特征处理工具。
相关知识
【特征选择与降维】主成分分析 PCA
PCA主成分分析去噪与降维
基于PCA与LDA的数据降维实践
主成分分析:PCA的思想及鸢尾花实例实现
机器学习(三)降维之PCA及鸢尾花降维
人工智能算法原理与代码实战:特征选择与降维的技术 2
PCA实现鸢尾花数据集降维可视化
使用PCA对Iris数据集进行降维和二维分类显示
使用pca的降维方法对sklearn官方iris(鸢尾花)数据集进行降维,并绘图显示
机器学习利用PCA完成鸢尾花数据集的降维与分类
网址: 【特征选择与降维】主成分分析 PCA https://m.huajiangbk.com/newsview2587100.html
| 上一篇: 邮储银行亳州市分行举办“魅力女神 |
下一篇: 2026年花艺师实操考试试卷答案 |