1、降维技术简介

        降维技术‌(Dimensionality Reduction)是机器学习和数据科学中常用的技术,旨在减少数据的维度,同时尽可能保留原始数据的重要特征。降维可以显著提高数据处理效率,减少计算复杂度,并有助于数据可视化。 降维的关键在于找到数据内在的低维结构(如流形)或识别出最能解释数据变异性的方向(如主成分)。

2、为什么需要降维?

  1. “维度诅咒”:随着特征维度增加,数据变得极其稀疏,距离度量失效,模型难以学习有效模式,计算效率急剧下降。

  2. 可视化:人类无法直接理解超过三维的空间。降维(通常到2D或3D)是可视化高维数据结构和模式的唯一途径。

  3. 去除噪声和冗余:高维数据常包含噪声或不相关、冗余的特征。降维有助于提取关键信息。

  4. 提高计算效率:减少特征数量能显著加速后续的机器学习算法(如分类、聚类)。

  5. 改善模型性能:去除噪声和冗余特征有时能提高模型的泛化能力,避免过拟合。

3、主要降维方技术

        降维技术有很多种,本文主要介绍 PCA, t-SNE, UMAP,LDA,LLE和MDS几种降维技术。本文的示例代码都是建立在scikit-learn库中内置的鸢尾花(Iris)数据集的基础上示例,并不是说这个个数据集适用于所有的每种降维技术。数据的加载代码如下:

# 导入公共依赖
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE, MDS, LocallyLinearEmbedding
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import umap  # 需要安装:pip install umap-learn

# 加载并预处理数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

# 标准化数据(对基于距离的方法很重要)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 设置颜色和标记用于可视化
colors = ['navy', 'turquoise', 'darkorange']
markers = ['o', 's', '^']

3.1、PCA

        PCA是 Principal Component Analysis 的简称,中文是主成分分析,是最长用的一种降维技术。它基于线性代数(特征值分解/SVD)。寻找数据方差最大的方向(主成分),这些方向彼此正交(不相关)。数据点投影到这些主成分上实现降维。

  • 优点

    • 计算高效:有成熟高效的数值算法(SVD)。

    • 可解释性:主成分方向有时可以对应原始特征的物理含义(线性组合)。

    • 保留全局结构:最大化保留数据的总体方差(即全局结构)。

    • 去相关:降维后的特征彼此线性无关。

    • 广泛应用:是基础且广泛使用的技术。

  • 缺点

    • 线性假设:只能捕获数据中的线性结构和关系。对于非线性结构(如螺旋、嵌套圆环)效果差。

    • 对离群点敏感:方差最大化容易受极端值影响。

    • 信息损失:舍弃的小方差主成分可能包含有区分性的信息(尤其在分类任务中)。

  • 适用场景

    • 数据具有线性结构或近似线性结构。

    • 需要快速降维作为预处理步骤(去噪、压缩)。

    • 需要可解释的成分方向(如金融、生物领域)。

    • 数据量较大,计算效率要求高。

    • 不适用于非线性流形数据的可视化或结构探索。

  • 代码示例: 
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('PCA of IRIS dataset')
plt.xlabel('Principal Component 1 (%.2f%%)' % (pca.explained_variance_ratio_[0]*100))
plt.ylabel('Principal Component 2 (%.2f%%)' % (pca.explained_variance_ratio_[1]*100))
plt.legend()
plt.show()

3.2、t-SNE

        t-SNE是t-Distributed Stochastic Neighbor Embedding的简称,中文意思是t-分布随机邻域嵌入。基于概率建模。在高维空间计算数据点对的相似度(条件概率),在低维空间也计算点对的相似度(使用t分布),然后通过梯度下降最小化两个概率分布之间的KL散度。核心是保持局部邻域结构。

  • 优点

    • 卓越的局部结构保留:特别擅长揭示数据中的簇、局部聚集结构,可视化效果通常非常清晰。

    • 非线性能力:能有效捕捉复杂的非线性流形结构。

    • 解决“拥挤问题”:使用t分布(重尾)在低维空间中能更好分离中等距离的点,缓解了SNE的拥挤问题。

  • 缺点

    • 计算复杂度高:O(N²),难以处理大规模数据(通常上限在万级样本)。

    • 随机性:结果依赖于初始化和随机种子,需要多次运行。

    • 超参数敏感:困惑度(Perplexity)的选择对结果影响很大。

    • 不保留全局结构:对远距离点之间的关系保持较差,簇间距离无意义。

    • 不可解释:低维坐标轴没有明确的物理含义。

    • 不适合特征提取:主要用于可视化,降维结果难以直接用于下游任务(如分类器训练)。

  • 适用场景

    • 高维数据的可视化(特别是探索局部簇结构),如单细胞RNA测序数据、图像特征可视化、词嵌入可视化。

    • 不适用于大规模数据、需要保留全局结构、需要降维后特征用于建模或需要可解释结果的场景。

  • 代码示例:  
# t-SNE
tsne = TSNE(n_components=2, random_state=42, perplexity=30)
X_tsne = tsne.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_tsne[y == i, 0], X_tsne[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('t-SNE of IRIS dataset')
plt.xlabel('t-SNE Dimension 1')
plt.ylabel('t-SNE Dimension 2')
plt.legend()
plt.show()

3.3、UMAP

        UMAP是Uniform Manifold Approximation and Projection的简称,中文意思是均匀流形近似与投影 。结合了流形学习和拓扑学思想。在高维空间用模糊拓扑表示邻域关系(基于最近邻),在低维空间也用模糊拓扑表示,通过最小化两个拓扑结构之间的交叉熵损失函数进行优化。目标是同时保留数据的局部和全局结构。

  • 优点

    • 保留局部和全局结构:效果优于t-SNE在全局结构上的表现,簇间距离更有意义。

    • 计算效率高:优化算法高效,复杂度接近O(N log N),能处理比t-SNE大得多的数据集(数十万甚至百万级)。

    • 非线性能力:能有效处理非线性流形。

    • 结果稳定性:通常比t-SNE对初始化和超参数(如邻居数)更鲁棒。

    • 可用于特征提取:降维结果有时可直接用于下游任务。

  • 缺点

    • 理论基础相对复杂:理解其数学原理比PCA和t-SNE更难。

    • 超参数影响:邻居数等参数对结果仍有影响,需要调整。

    • 可解释性有限:低维坐标轴仍缺乏直接物理意义。

    • 相对较新:虽然发展迅速,但历史和应用验证不如PCA/t-SNE悠久。

  • 适用场景

    • 高维数据可视化(替代t-SNE的首选,尤其当关注全局结构或数据量大时)。

    • 大规模数据的降维预处理

    • 需要降维后特征用于下游任务(如聚类、分类)。

    • 不适用于对计算效率要求极端苛刻(PCA仍是首选)或需要强可解释性成分的场景。

  • 代码示例:   
# LDA
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('LDA of IRIS dataset')
plt.xlabel('LD 1')
plt.ylabel('LD 2')
plt.legend()
plt.show()

 3.4、LDA

        LDA 是Linear Discriminant Analysis 的简称,中文是线性判别分析。监督降维方法。寻找能最大化类间散布(不同类别中心距离)同时最小化类内散布(同一类别内数据点分散程度)的投影方向。目标是找到最有利于区分已知类别的低维空间。

  • 优点

    • 利用标签信息:能显著提升分类任务的性能(相比无监督方法PCA)。

    • 保留判别信息:投影方向专门设计用于分离不同类别。

    • 可解释性:判别轴有时可以解释。

    • 计算高效

  • 缺点

    • 严格监督:必须有类别标签。

    • 线性假设:只能找到线性投影方向,无法处理非线性可分问题。

    • 维度限制:最大降维维度为 C-1(C是类别数)。

    • 对分布假设敏感:假设数据服从高斯分布且各类协方差矩阵相同(同方差性),现实数据不一定满足。

  • 适用场景

    • 分类任务前的特征降维(当数据大致满足LDA假设时效果最好)。

    • 有监督的可视化(观察已知类别在低维空间的分离情况)。

    • 不适用于无标签数据、非线性可分问题或类别数很多时需要降到很低维度的场景。

  • 代码示例:    
# LDA
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('LDA of IRIS dataset')
plt.xlabel('LD 1')
plt.ylabel('LD 2')
plt.legend()
plt.show()

  3.5、LLE

        LLE是Locally Linear Embedding的简称,中文是局部线性嵌入。 基于流形学习的非线性方法。核心假设是数据在局部邻域内是线性的。

  1. 为每个点找到其K个最近邻。
  2. 用其邻居点的线性组合(权重)来重构该点,最小化重构误差(保留局部线性关系)。
  3. 保持这些重构权重不变,在低维空间中寻找点的新位置,使得用同样邻居和权重重构点的误差最小。
  • 优点

    • 非线性能力:能揭示复杂的非线性流形结构。

    • 保留局部几何结构:对局部邻域关系保持较好。

    • 无迭代优化:核心计算是求解线性系统,没有像t-SNE/UMAP那样的迭代优化(虽然找邻居也费时)。

  • 缺点

    • 对邻居数K敏感:K太小导致不连通,K太大破坏局部线性假设。

    • 难以处理新样本:缺乏显式映射函数,新数据点需要重新计算或近似(称为“样本外扩展”问题)。

    • 对噪声和离群点敏感:局部重构容易受影响。

    • 可能产生扭曲:在保持局部结构时可能扭曲全局结构。

    • 计算复杂度:找邻居O(N²),求解权重O(NK³),大规模数据仍有挑战。

  • 适用场景

    • 探索非线性流形结构的可视化(尤其是当数据确实由局部线性片构成时)。

    • 不适用于大规模数据、需要处理新数据、数据噪声大或对全局结构保持要求高的场景。应用逐渐被t-SNE/UMAP取代。

  • 示例代码

# LLE - 注意:LLE对参数敏感,尝试不同n_neighbors值
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=12, method='standard', random_state=42)
X_lle = lle.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_lle[y == i, 0], X_lle[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('LLE of IRIS dataset (n_neighbors=12)')
plt.xlabel('LLE Dimension 1')
plt.ylabel('LLE Dimension 2')
plt.legend()
plt.show()

  3.6、MDS

         MDS是Multi-Dimensional Scaling的简称,中文意思是多维尺度变换。目标是在低维空间中保持数据点之间的距离(或差异度)尽可能接近它们在高维空间中的距离(或差异度)。有不同变种:度量MDS (Classic/Metric MDS):假设高维距离是欧氏距离,并试图在低维精确重建这些距离(通过特征值分解);非度量MDS (Non-Metric MDS):只要求保持距离的单调关系(即高维距离大,低维距离也大;高维距离小,低维距离也小),适用于非欧氏或序数距离。通常通过迭代优化(如Sammon映射)。

  • 优点

    • 概念直观:目标明确(保持距离)。

    • 适用于任意距离/相异度矩阵:输入可以是自定义的相异度矩阵,不限于欧氏距离(尤其非度量MDS)。

    • 保留全局结构(尤其是度量MDS)。

  • 缺点

    • 计算复杂度高:经典MDS O(N³)(特征值分解),非度量MDS O(N²)(迭代优化)。

    • 非线性结构保持有限:经典MDS是线性的(类似PCA)。非度量MDS能处理非线性,但计算更慢。

    • 结果可能不稳定(非度量MDS)。

    • 对噪声敏感

  • 适用场景

    • 需要基于特定距离/相异度进行可视化的场景(如心理测量学、生态学、遗传学)。

    • 探索数据点之间的整体(全局)相似性/差异性模式

    • 当输入就是距离矩阵时

    • 不适用于大规模数据(尤其经典MDS)、需要强保持局部结构、或对计算效率要求高的场景。

  • 示例代码:

# MDS - 计算密集型,小型数据集适用
mds = MDS(n_components=2, random_state=42, dissimilarity='euclidean')
X_mds = mds.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(8, 6))
for color, i, target_name, marker in zip(colors, [0, 1, 2], target_names, markers):
    plt.scatter(X_mds[y == i, 0], X_mds[y == i, 1], 
                color=color, marker=marker, label=target_name)
plt.title('MDS of IRIS dataset')
plt.xlabel('MDS Dimension 1')
plt.ylabel('MDS Dimension 2')
plt.legend()
plt.show()

  3.7、总结

如何选择?

  1. 有无标签?

    • 有标签且目标是分类:优先考虑 LDA (如果数据大致满足其假设)。

    • 无标签:继续判断。

  2. 主要目标是什么?

    • 快速预处理/压缩/去噪PCA 通常是首选起点。

    • 数据可视化

      • 数据量小 (<10,000):t-SNE (专注局部簇) 或 UMAP (平衡局部全局)。

      • 数据量大:UMAP 是更可行的选择。

      • 基于特定距离/相异度:MDS (尤其非度量)。

      • 探索非线性局部线性流形:LLE (但UMAP通常更优)。

    • 降维后特征用于下游任务(聚类/分类)PCAUMAP 是常见选择。LDA仅适用于有监督分类。

  3. 数据结构?

    • 线性结构明显PCALDA (监督) 效果很好。

    • 复杂非线性/流形结构t-SNEUMAPLLE非度量MDS

  4. 数据规模?

    • 超大:PCAUMAP

    • 中小:所有方法都可尝试,但注意 t-SNE/经典MDS/LLE 的上限。

降维技术 核心目标 监督/无监督 线性/非线性 优点 缺点 最佳适用场景
PCA 最大化方差 (全局) 无监督 线性 快、可解释、全局结构 忽略非线性、忽略标签  线性数据、快速预处理、去噪、压缩
t-SNE 保持局部邻域概率 无监督 非线性 极佳的局部结构可视化 慢、随机、只保留局部、不适用下游 高维数据可视化 (探索局部簇)
UMAP 保持局部和全局拓扑 无监督 非线性 快(相对t-SNE)、局部+全局、可下游 较新、理论复杂、参数影响  高维可视化 (大规模/需全局)、下游降维
LDA 最大化类间/类内散度比 监督 线性 提升分类、判别性好 需标签、线性假设、维度限制 分类前降维、监督可视化
LLE 保持局部线性重构权重 无监督 非线性 保留局部几何、无迭代优化 对K敏感、样本外扩展难、全局差  非线性流形可视化 (局部线性)
MDS (Metric) 保持点间距离 (欧氏) 无监督 线性 (经典) 概念直观、保持距离/相异度 慢(O(N³))、全局为主 基于距离的可视化、全局结构 
MDS (Non-Metric) 保持点间距离的序关系 无监督 非线性 处理任意相异度、序数关系 慢(迭代)、结果不稳定  非欧氏/序数距离可视化

         对于新数据集,可以先尝试 PCA 快速了解全局方差分布和线性结构。如果目标是可视化复杂结构,UMAP 通常是目前最通用和强大的选择,尤其在数据量不是特别巨大时。t-SNE 在追求极致清晰的局部簇分离可视化时仍有价值。LDA 在有监督分类场景中值得一试。MDS 在输入是特定相异度矩阵时不可替代。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐