Python打卡 DAY 21 常见的降维算法
要求n_features > n_classes。附:各算法在Scikit-learn中的关键参数。尝试用t-SNE输出作为模型输入特征。:比t-SNE更快且更好保持全局结构。:最大化类间距离,最小化类内距离。X = UΣVᵀ (奇异值分解)仅适合可视化(不适合特征预处理):特别适合单细胞RNA序列数据。:深度学习方法处理复杂非线性。稀疏PCA(增强可解释性)S_b = 类间散度矩阵。S_w =
·
一、核心算法对比速查表
| 算法 | 类型 | 监督性 | 保持结构 | 适合维度 | 输出可解释性 | 计算复杂度 |
|---|---|---|---|---|---|---|
| LDA | 线性 | 有监督 | 类间分离 | 低-中维 | 高 | O(n³) |
| PCA | 线性 | 无监督 | 全局方差 | 高维 | 中 | O(n³) |
| t-SNE | 非线性 | 无监督 | 局部相似 | 超高清 | 低 | O(n²) |

二、算法详解
1. LDA(线性判别分析)
核心思想:最大化类间距离,最小化类内距离
数学目标:
argmax_W (Wᵀ S_b W) / (Wᵀ S_w W)
其中:
S_b = 类间散度矩阵
S_w = 类内散度矩阵
实现步骤:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X, y) # 需要标签y
典型应用场景:
-
人脸识别前的特征压缩
-
分类任务的特征预处理
2. PCA(主成分分析)
核心思想:寻找方差最大的正交方向
关键公式:
X = UΣVᵀ (奇异值分解) 主成分 = XV
特征选择:
# 累积方差解释率计算
pca = PCA().fit(X)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('主成分数量')
plt.ylabel('累积解释方差')
优化变种:
-
增量PCA(大数据集)
-
稀疏PCA(增强可解释性)
-
核PCA(非线性扩展)
3. t-SNE(t分布随机邻域嵌入)
核心优势:完美保持局部结构
参数调优:
from sklearn.manifold import TSNE
tsne = TSNE(
n_components=2,
perplexity=30, # 建议5-50
early_exaggeration=12,
learning_rate='auto'
)
X_tsne = tsne.fit_transform(X)
注意事项:
-
仅适合可视化(不适合特征预处理)
-
不同运行结果可能不一致
-
对超参数敏感
三、实战对比案例
MNIST数据集降维效果
import matplotlib.pyplot as plt
methods = {
'PCA': PCA(n_components=2),
'LDA': LinearDiscriminantAnalysis(n_components=2),
't-SNE': TSNE(n_components=2)
}
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
for (name, model), ax in zip(methods.items(), axes):
X_reduced = model.fit_transform(X, y) if name=='LDA' else model.fit_transform(X)
ax.scatter(X_reduced[:,0], X_reduced[:,1], c=y, cmap='tab10', s=5)
ax.set_title(name)
四、算法选择决策树

五、常见误区
-
LDA陷阱:
-
要求n_features > n_classes
-
对非高斯分布数据效果差
-
-
PCA误用:
-
未标准化数据导致方差主导错误
-
用训练集统计量处理测试集
-
-
t-SNE滥用:
-
尝试用t-SNE输出作为模型输入特征
-
忽视perplexity参数调整
-
六、进阶方向
-
UMAP:比t-SNE更快且更好保持全局结构
-
Autoencoder:深度学习方法处理复杂非线性
-
PHATE:特别适合单细胞RNA序列数据
附:各算法在Scikit-learn中的关键参数
# PCA
PCA(n_components=None, whiten=False, svd_solver='auto')
# LDA
LinearDiscriminantAnalysis(n_components=None, solver='svd')
# t-SNE
TSNE(n_components=2, perplexity=30.0, early_exaggeration=12.0)
更多推荐

所有评论(0)