DAY 21 常见的降维算法

知识点回顾:

  1. LDA线性判别
  2. PCA主成分分析
  3. t-sne降维

特征降维

通常情况下,我们提到特征降维,很多时候默认指的是无监督降维,这种方法只需要特征数据本身。但是实际上还包含一种有监督的方法

1.  无监督降维 (Unsupervised Dimensionality Reduction)

  • 定义:这类算法在降维过程中不使用任何关于数据样本的标签信息(比如类别标签、目标值等)。它们仅仅根据数据点本身的分布、方差、相关性、局部结构等特性来寻找低维表示。
  • 输入:只有特征矩阵 X
  • 目标
    • 保留数据中尽可能多的方差(如 PCA)。
    • 保留数据的局部或全局流形结构(如 LLE, Isomap, t-SNE, UMAP)。
    • 找到能够有效重构原始数据的紧凑表示(如 Autoencoder)。
    • 找到统计上独立的成分(如 ICA)。
  • 典型算法:
    • PCA (Principal Component Analysis) / SVD (Singular Value Decomposition)
    • t-SNE (t-distributed Stochastic Neighbor Embedding)
    • UMAP (Uniform Manifold Approximation and Projection)
    • LLE (Locally Linear Embedding)
    • Isomap (Isometric Mapping)
    • Autoencoders (基本形式)
    • ICA (Independent Component Analysis)

 “只需要特征就可以对特征降维了”:这句话描述的就是无监督降维。算法通过分析特征间的关系和分布来进行降维。

2.  有监督降维 (Supervised Dimensionality Reduction)

  • 定义:这类算法在降维过程中会利用数据样本的标签信息(通常是类别标签 y)。它们的目标是找到一个低维子空间,在这个子空间中,不同类别的数据点能够被更好地分离开,或者说,这个低维表示更有利于后续的分类(或回归)任务。
  • 输入:特征矩阵 X 和对应的标签向量 y。
  • 目标
    • 最大化不同类别之间的可分性,同时最小化同一类别内部的离散度(如 LDA)。
    • 找到对预测目标变量 `y` 最有信息量的特征组合。
  • 典型算法
    • LDA (Linear Discriminant Analysis):这是最经典的监督降维算法。它寻找的投影方向能够最大化类间散度与类内散度之比。
    • 还有一些其他的,比如 NCA (Neighbourhood Components Analysis),但 LDA 是最主要的代表。

“还需要有分类标签么”:对于有监督降维,分类标签(或其他形式的监督信号)是必需的。

PCA等无监督降维方法的目标是保留数据的最大方差,这些方差大的方向不一定是对分类最有用的方向。因此,在分类任务中,LDA通常比PCA更直接有效。

# # umap-learn 是一个用于降维和可视化的库,特别适合处理高维数据。它使用了一种基于流形学习的算法,可以有效地将高维数据嵌入到低维空间中,同时保持数据的局部结构。
# !pip install umap-learn -i https://pypi.tuna.tsinghua.edu.cn/simple

主要成分分析(PCA)

1. PCA 何时适用?数据是线性还是非线性?

  • 线性性:
    • PCA 是一种线性降维方法。它假设主成分是原始特征的线性组合。
    • 它寻找的是一个能够最好地捕捉数据方差的线性子空间。
    • 如果你的数据的潜在结构是高度非线性的(例如,“瑞士卷”形状、螺旋形),PCA可能无法有效地在低维空间中捕捉这种结构。它可能会将这类结构“压平”或扭曲。
  • PCA 效果好的情况:
    • 目标是最大化方差:当你认为数据中方差最大的方向包含了最重要的信息时。这在去噪或特征间存在相关性时通常是成立的。
    • 数据分布大致呈椭球形或存在线性相关性:PCA 擅长找到这类分布的主轴。
    • 作为其他线性模型的预处理步骤:不相关的主成分有时能让线性模型(如逻辑回归、线性SVM)表现更好。
    • 探索性数据分析 (EDA):快速了解数据变异的主要模式。
    • 降噪:假设噪声的方差低于信号的方差,PCA可以通过舍弃低方差的成分来帮助降噪。
    • 当原始特征数量非常多,且存在多重共线性时:PCA可以通过生成少数几个不相关的主成分来解决多重共线性问题,并减少特征数量。
  • PCA 可能不适用或需要谨慎使用的情况:
    • 高度非线性数据:对于分布在复杂流形上的数据(例如“瑞士卷”、“S型曲线”),PCA会将其投影到一个线性子空间,这可能会丢失关键的非线性关系。在这种情况下,非线性降维技术(如 t-SNE, UMAP, LLE, Isomap, 核PCA, 自编码器)会是更好的选择。
    • 方差并非衡量重要性的唯一标准:有时,方差较小的方向可能对特定任务至关重要(例如,在分类问题中,如果使用LDA,一个整体方差较小的方向可能对区分类别非常有效)。PCA是无监督的,它不考虑类别标签。
    • 主成分的可解释性:虽然主成分是原始特征的线性组合,但与保留原始、可解释的特征相比,它们的直接物理解释有时可能更具挑战性。
    • 数据特征尺度差异巨大:如果特征的尺度(单位或数值范围)相差悬殊(例如,一个特征以米为单位,另一个以毫米为单位),那么尺度较大的特征将在方差计算中占据主导地位,从而主导第一主成分。这就是为什么在应用PCA之前几乎总是推荐进行数据标准化(例如,将特征缩放到均值为0,方差为1)。

2. 总而言之,可以将PCA视为:

1.  对数据进行均值中心化。

2.  对中心化后的数据进行SVD。

3.  使用SVD得到的右奇异向量 V 作为主成分方向。

4.  使用奇异值 S 来评估每个主成分的重要性(解释的方差)。

5.  使用 U*S(或 X_centered * V)来获得降维后的数据表示。

t-分布随机邻域嵌入 (t-SNE)

t-SNE:保持高维数据的局部邻域结构,用于可视化

PCA 的目标是保留数据的全局方差,而 t-SNE 的核心目标是在高维空间中相似的数据点,在降维后的低维空间中也应该保持相似(即彼此靠近),而不相似的点则应该相距较远。

它特别擅长于将高维数据集投影到二维或三维空间进行可视化,从而揭示数据中的簇结构或流形结构。——深度学习可视化中很热门

1. 使用 t-SNE 时需要注意的事项:

  • 计算成本高:对于非常大的数据集(例如几十万甚至上百万样本),t-SNE 的计算会非常慢。通常建议在应用 t-SNE 之前,先用 PCA 将数据降到一个适中的维度(例如50维),这样可以显著加速 t-SNE 的计算并可能改善结果。
  • 超参数敏感:
    • Perplexity (困惑度):这个参数对结果影响较大。常见的取值范围是 5 到 50。较小的困惑度关注非常局部的结构,较大的困惑度则考虑更广泛的邻域。通常需要尝试不同的值。
    • n_iter (迭代次数):需要足够的迭代次数让算法收敛。默认值通常是1000。如果可视化结果看起来还不稳定,可以尝试增加迭代次数。
    • learning_rate (学习率):也可能影响收敛。
  • 结果的解释:
    • 簇的大小和密度在 t-SNE 图中没有直接意义。t-SNE 会尝试将所有簇展开到相似的密度。不要根据簇在图上的大小来判断原始数据中簇的实际大小或密度。
    • 点之间的距离在全局上没有意义。两个相距较远的簇,它们之间的距离并不代表它们在原始高维空间中的实际距离。t-SNE 主要保留的是局部邻域关系。
    • 多次运行结果可能不同:由于优化过程的随机初始化和梯度下降的性质,多次运行 t-SNE 可能会得到略微不同的可视化结果。但好的簇结构通常是稳定的。
    • 不适合作为通用的有监督学习预处理步骤:因为它的目标是可视化和保持局部结构,而不是最大化类别可分性或保留全局方差,所以它通常不直接用于提高分类器性能的降维。LDA 或 PCA (在某些情况下) 更适合这个目的。

2. 总结:

t-SNE 是一种强大的非线性降维技术,主要用于高维数据的可视化。它通过在低维空间中保持高维空间中数据点之间的局部相似性(邻域关系)来工作。与PCA关注全局方差不同,t-SNE 更关注局部细节。理解它的超参数(尤其是困惑度)和结果的正确解读方式非常重要。

线性判别分析 (Linear Discriminant Analysis, LDA)

核心定义与目标:
线性判别分析 (LDA) 是一种经典的有监督降维算法,也常直接用作分类器。作为降维技术时,其核心目标是找到一个低维特征子空间(即原始特征的线性组合),使得在该子空间中,不同类别的数据点尽可能地分开(类间距离最大化),而同一类别的数据点尽可能地聚集(类内方差最小化)。

工作原理简述:
LDA 通过最大化 “类间散布矩阵” 与 “类内散布矩阵” 之比的某种度量(例如它们的行列式之比)来实现其降维目标。它寻找能够最好地区分已定义类别的投影方向。

关键特性:

  • 有监督性 (Supervised):这是 LDA 与 PCA 最根本的区别。LDA 在降维过程中必须使用数据的类别标签 (y) 来指导投影方向的选择,目的是优化类别的可分离性。
  • 降维目标维度 (Number of Components):LDA 降维后的维度(即生成的判别特征的数量)有一个严格的上限:min (n_features, n_classes - 1)。
    • n_features:原始特征的数量。
    • n_classes:类别标签 (y) 中不同类别的数量。
    • 这意味着,例如,对于一个二分类问题 (n_classes = 2),LDA 最多能将数据降至 1 维。如果有 5 个类别,最多能降至 4 维(前提是原始特征数不少于 4)。这个特性直接源于其优化目标。
  • 线性变换 (Linear Transformation):与 PCA 类似,LDA 也是一种线性方法。它找到的是原始特征的线性组合来形成新的、具有判别能力的低维特征(称为判别向量或判别成分)。
  • 数据假设 (Assumptions):
    • 理论上,LDA 假设每个类别的数据服从多元高斯分布。
    • 理论上,LDA 假设所有类别具有相同的协方差矩阵。
    • 在实践中,即使这些假设不完全满足,LDA 通常也能表现良好,尤其是在类别大致呈椭球状分布且大小相似时。

输入要求:

  • 特征 (X):数值型特征。如果存在类别型特征,通常需要先进行预处理(如独热编码)。
  • 标签 (y):一维的、代表类别身份的数组或 Series (例如 [0, 1, 0, 2, 1])。LDA 不需要标签进行独热编码。标签的类别数量直接决定了降维的上限。

与特征 (X) 和标签 (y) 的关系:

  • LDA 的降维过程和结果直接由标签 y 中的类别结构驱动。它试图找到最能区分这些由 y 定义的类别的特征组合。
  • 原始特征 X 提供了构建这些判别特征的原材料。特征 X 的质量和相关性会影响 LDA 的效果,但降维的 “方向盘” 是由 y 控制的。

优点:

  • 直接优化类别可分性,非常适合作为分类任务的预处理步骤,往往能提升后续分类器的性能。
  • 计算相对高效。
  • 生成的低维特征具有明确的判别意义。

局限性与注意事项:

  • 降维的维度受限n_classes - 1,这可能比 PCA 能达到的降维程度低很多,尤其是在类别数较少时。
  • 作为线性方法,可能无法捕捉数据中非线性的类别结构。如果类别边界是非线性的,LDA 效果可能不佳。
  • 对数据的高斯分布和等协方差假设在理论上是存在的,极端偏离这些假设可能影响性能。
  • 如果类别在原始特征空间中本身就高度重叠,LDA 的区分能力也会受限。

适用场景:

  • 当目标是提高后续分类模型的性能时,LDA 是一个强有力的降维工具。
  • 当类别信息已知且被认为是区分数据的主要因素时。
  • 当希望获得具有良好类别区分性的低维表示时,尤其可用于数据可视化(如果能降到 2D 或 3D)。

简而言之,LDA 是一种利用类别标签信息来寻找最佳类别分离投影的降维方法,其降维的潜力直接与类别数量挂钩。

@浙大疏锦行

### 数据平滑与方法的图表或可视化图像 对于数据平滑,提琴形图是一种有效的工具来表示数据的整体分布情况。这种图形不仅展示了数据密度的变化趋势,还能够通过其形状直观反映出不同部分的数据密集程度[^3]。 ```python import seaborn as sns import matplotlib.pyplot as plt # 创建示例提琴图 tips = sns.load_dataset("tips") plt.figure(figsize=(8, 6)) sns.violinplot(x="day", y="total_bill", data=tips) plt.title('Violin Plot Example') plt.show() ``` 针对处理,通常采用的技术包括主成分分析(PCA)、t-SNE 和 UMAP 等算法。这些技术可以将多度的数据映射到二或三的空间内以便更好地理解和解释复杂的关系模式。为了说明这一点,下面提供了一个基于 PCA 的简单例子: ```python from sklearn.decomposition import PCA from sklearn.datasets import load_iris import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载鸢尾花数据集并应用PCA至两 iris = load_iris() pca = PCA(n_components=2) principalComponents = pca.fit_transform(iris.data) df_pca = pd.DataFrame(data = principalComponents, columns = ['PC1', 'PC2']) # 绘制散点图展示效果 plt.figure(figsize=(8, 6)) for target in set(iris.target): mask = iris.target == target plt.scatter(df_pca.loc[mask, 'PC1'], df_pca.loc[mask, 'PC2'], label=f'Class {target}', alpha=0.7) plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.legend(title='Species') plt.grid(True) plt.title('PCA of IRIS Dataset') plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值