1. PCA原理
目标:找正交投影使方差最大。max wᵀΣw s.t. ‖w‖=1
Σ=(1/(n-1))XᶜᵀXᶜ → 特征分解Σ=VΛVᵀ → 第k主成分=第k大特征值对应特征向量
SVD: Xᶜ=UΣVᵀ → 数值更稳定,不显式计算Σ
2. 方差解释比
ρₖ=λₖ/Σλⱼ,累积≥85-95%选k。碎石图在拐点截断。
3. 预处理
中心化(必须)、标准化(量纲不同时必须)、白化(单位协方差)
4. 局限
- 只捕获线性结构 2. 全局→可能忽略局部 3. 主成分难解释 4. 异常值敏感 5. 方差≠重要性
替代:Kernel PCA、ICA、LDA(有监督)
5. 增量PCA与随机化PCA
增量PCA: 分批处理大数据。随机化SVD: k远小于d时高效。
Python代码实现与验证
💡 代码说明:以下代码使用 Python / Scikit-learn 实现,已实机运行验证。
完整代码
import numpy as np
from sklearn.decomposition import PCA, IncrementalPCA
from sklearn.datasets import load_iris, load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
np.random.seed(42)
iris = load_iris()
pipe = Pipeline([('s',StandardScaler()),('pca',PCA())])
pipe.fit(iris.data)
pca = pipe.named_steps['pca']
print("=== Iris PCA ===")
print("方差解释比: {}".format(pca.explained_variance_ratio_.round(4)))
print("累积: {}".format(np.cumsum(pca.explained_variance_ratio_).round(4)))
for t in [0.85,0.90,0.95,0.99]:
n = np.argmax(np.cumsum(pca.explained_variance_ratio_)>=t)+1
print("累积>{}: 需要{}个主成分".format(t,n))
digits = load_digits()
print("\n=== 手写数字PCA ===")
for n in [2,10,20,30,40]:
pipe2 = Pipeline([('s',StandardScaler()),('pca',PCA(n_components=n))])
pipe2.fit(digits.data)
v = np.sum(pipe2.named_steps['pca'].explained_variance_ratio_)
print("n={}: 累积方差={:.4f}".format(n,v))
pipe3 = Pipeline([('s',StandardScaler()),('pca',PCA(n_components=30))])
X_t = pipe3.fit_transform(digits.data)
X_r = pipe3.inverse_transform(X_t)
mse = np.mean((StandardScaler().fit_transform(digits.data)-X_r)**2)
print("\n30维PCA重建MSE: {:.6f}".format(mse))
运行结果
=== Iris PCA ===
方差解释比: [0.7296 0.2285 0.0367 0.0052]
累积: [0.7296 0.9581 0.9948 1. ]
累积>0.85: 需要2个主成分
累积>0.9: 需要2个主成分
累积>0.95: 需要2个主成分
累积>0.99: 需要3个主成分
=== 手写数字PCA ===
n=2: 累积方差=0.2159
n=10: 累积方差=0.5887
n=20: 累积方差=0.7931
n=30: 累积方差=0.8932
n=40: 累积方差=0.9508
30维PCA重建MSE: 52.383979
✅ 验证通过
深入理解:无监督学习的实践指南
何时使用无监督学习?
- 探索性分析:发现数据中的隐藏结构
- 特征工程:聚类标签/降维结果作为新特征
- 异常检测:没有标签时的异常发现
- 数据压缩:降维减少存储和计算
- 半监督学习:先无监督聚类,再用少量标签
无监督学习评估挑战
没有标签,如何评估?
| 方法 | 内部指标 | 外部指标 |
| 聚类 | 轮廓系数/CH/DB | ARI/NMI(如有标签) |
| 降维 | 重建误差/方差解释 | 下游任务性能 |
| 异常检测 | — | AUC-PR(如有标签) |
无监督学习常见陷阱
- 过度解读:聚类结果可能是噪声而非真实结构
- 参数敏感:K/eps/MinPts的选择影响巨大
- 维度灾难:高维数据中距离失去意义
- 忽略领域知识:纯数据驱动可能发现无意义的模式
- 可视化误导:2D投影可能扭曲高维结构
进阶话题与实践经验
无监督学习的工程实践
无监督学习在实践中最常用于数据探索和特征工程,而非直接产出最终模型。以下是关键经验:
聚类用于特征工程:聚类标签作为新特征喂给下游监督模型,常常能带来显著提升。例如,用户行为聚类标签+原始特征 → 预测模型。关键是要用交叉验证内的聚类,否则数据泄露。
降维加速训练:当特征维度>1000时,先PCA降到100维再训练,可能反而提升性能(去噪效果)。但PCA是线性方法,非线性数据考虑UMAP/Autoencoder。
异常检测的多层架构:工业界通常用三层架构——规则引擎(快速精确已知模式)→统计方法(Z-score/IQR/控制图)→ML模型(Isolation Forest/自编码器)→人工审核。
聚类方法的业务应用
聚类的业务价值在于"分组施策"。同一个K值可能统计指标最优,但业务上不可行(如K=20个客户群,营销团队无法管理)。选择K值时,业务约束优先于统计指标。
降维的可视化陷阱
- t-SNE的簇大小不反映真实密度(密集区域被扩展)
- t-SNE的簇间距不反映真实距离(不同簇可能很远也可能很近)
- t-SNE结果受随机种子影响,多次运行确认结构
- 2D投影必然损失信息,高维中分离的簇在2D中可能重叠
- 先PCA降维到50维再做t-SNE,比直接对高维数据做t-SNE更稳定
异常检测的评估策略
异常检测评估的特殊性:极度不平衡+标签稀缺。推荐方案:
- 有少量标签:用AUC-PR作为主指标
- 无标签:人工审核top N异常,计算精确率
- 合成异常:向正常数据注入人工异常,评估检出率
- 历史回测:用过去标记的异常事件作为评估集
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
补充:关键概念与面试要点
核心直觉
- 正则化 = 给模型加"约束",防止过度拟合噪声
- 交叉验证 = "用数据的不同部分反复检验模型"
- 特征选择 = "选择携带最多目标信息的特征"
- 集成学习 = "三个臭皮匠顶个诸葛亮"
- 降维 = "抓住主要矛盾"
常见面试问题
- L1正则化为什么产生稀疏解?(几何:菱形与等高线在角上相交)
- 逻辑回归为什么用交叉熵而不用MSE?(MSE导致梯度消失)
- 随机森林为什么不容易过拟合?(Bagging降方差,特征随机降相关性)
- K-Means为什么收敛到局部最优?(目标函数非凸)
- PCA为什么需要中心化?(否则第一主成分指向均值方向)
📝 课后练习
- 实现本课核心算法并用Scikit-learn验证
- 调优关键超参数并记录性能变化
- 用交叉验证评估模型稳定性
- 与之前学过的方法对比分析
- 分析本课方法的失效条件