正在加载中...

展开本页目录
算法教程LLE-局部线性嵌入

LLE-局部线性嵌入

No.125 · 在线教程

局部线性嵌入(Locally Linear Embedding, LLE)是一类经典的流形学习方法。它的核心思想是:高维样本虽然整体分布可能是非线性的,但在每个样本的局部邻域内往往仍近似服从线性结构。LLE 先在原空间中用邻域重构权重刻画这种局部线性关系,再在低维空间中尽量保持…

LLE-局部线性嵌入

1. 方法概述

局部线性嵌入(Locally Linear Embedding, LLE)是一类经典的流形学习方法。它的核心思想是:高维样本虽然整体分布可能是非线性的,但在每个样本的局部邻域内往往仍近似服从线性结构。LLE 先在原空间中用邻域重构权重刻画这种局部线性关系,再在低维空间中尽量保持这些重构关系,从而得到非线性降维结果。

本项目中的 LLE-局部线性嵌入 模块并不是自写 LLE 求解器,而是对 sklearn.manifold.LocallyLinearEmbedding 的工程化封装。当前代码支持:

  1. standardmodifiedhessianltsa 四种 LLE 方法;
  2. autoarpackdense 三种特征分解策略;
  3. noneminmaxzscore 三种特征预处理方式;
  4. 输出低维嵌入、重构误差、Trustworthiness 指标与散点图。

与前面 KMeans-K-均值聚类 类似,本模块不要求首列必须是样本 ID。上传数据后,程序会自动识别哪些列能够完整转为数值列,并允许用户选择任意一列作为 label_col 用于结果展示;真正参与 LLE 计算的是用户勾选的数值型特征列。

设共有 \(n\) 个样本、\(p\) 个被选中的特征。记原始特征矩阵为

$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$

2. 数据要求与预处理

2.1 数据约束

根据 upload_widget.pyindicators_widget.pydata_validator.py 的实现,模块对输入数据的真实要求如下:

  1. 数据不能为空;
  2. 数据中至少存在 1 列可以完整转成数值的列;
  3. 选择的特征列必须存在;
  4. 特征列不能含空值或非数值项;
  5. 特征列不能是常数列;
  6. 至少选择 1 个特征;
  7. 真正进入计算时还要求: \(q<n_{\text{features}}\),\(k<n\),且 \(k>q\)。

其中 \(q=\texttt{n\_components}\),\(k=\texttt{n\_neighbors}\)。若用户把 label_col 同时选成特征列,代码会自动把它从 feature_cols 中移除,并写日志警告。

若未指定 label_col,程序会自动生成

$$ \text{样本1},\text{样本2},\ldots,\text{样本}n \tag{2} $$

作为结果表中的样本名称。

2.2 Min-Max 归一化

normalize="minmax" 时,程序按列执行

$$ z_{ij}=\frac{x_{ij}-x_j^{\min}}{x_j^{\max}-x_j^{\min}} \tag{3} $$

若某列极差为 0,代码会将分母替换为 1。

2.3 Z-score 标准化

normalize="zscore" 时,程序按列执行

$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{4} $$

其中 \(\mu_j\) 为均值,\(\sigma_j\) 为总体标准差;若 \(\sigma_j=0\),同样会改写为 1。

normalize="none",则直接令

$$ z_{ij}=x_{ij} \tag{5} $$

记处理后用于 LLE 的矩阵为

$$ Z=(z_{ij})_{n\times p} \tag{6} $$

2.4 符号说明

符号 含义
\(n\) 样本数量
\(p\) 特征维数
\(q\) 目标降维维度 n_components
\(k\) 邻居数 n_neighbors
\(z_i\) 第 \(i\) 个样本的预处理后特征向量
\(\mathcal{N}_k(i)\) 样本 \(i\) 的 \(k\) 近邻集合
\(w_{ij}\) 样本 \(i\) 用邻居 \(j\) 重构时的权重
\(y_i\) 样本 \(i\) 在低维空间中的嵌入坐标

3. 核心数学模型

3.1 局部线性重构

LLE 假设每个样本 \(z_i\) 都可以由其 \(k\) 个近邻做线性重构:

$$ z_i \approx \sum_{j\in\mathcal{N}_k(i)} w_{ij} z_j \tag{7} $$

并要求权重满足归一化约束

$$ \sum_{j\in\mathcal{N}_k(i)} w_{ij}=1 \tag{8} $$

LLE 的第一步是在原始空间中寻找一组权重 \(w_{ij}\),使局部重构误差尽量小:

$$ \min_{W}\sum_{i=1}^{n}\left\|z_i-\sum_{j\in\mathcal{N}_k(i)} w_{ij}z_j\right\|_2^2 \tag{9} $$

3.2 低维嵌入保持局部重构关系

在得到重构权重后,LLE 在低维空间中寻找坐标 \(y_i\in\mathbb{R}^q\),使这些权重关系尽可能保持不变:

$$ \min_{Y}\sum_{i=1}^{n}\left\|y_i-\sum_{j\in\mathcal{N}_k(i)} w_{ij}y_j\right\|_2^2 \tag{10} $$

其中低维表示矩阵为

$$ Y=(y_{ir})_{n\times q} \tag{11} $$

项目最终导出的嵌入列名为 LLE1LLE2、…,对应 Embedding 工作表。

3.3 四种 LLE 变体

当前项目把 method 直接传给 sklearn.manifold.LocallyLinearEmbedding,支持以下四种变体:

  1. standard
  2. modified
  3. hessian
  4. ltsa

其中:

  1. standard 是最经典的局部重构权重保持形式;
  2. modified 是对标准 LLE 的改进版本;
  3. hessian 对曲率结构更敏感;
  4. ltsa 更强调局部切空间对齐。

3.4 Hessian LLE 的邻居数约束

当前代码对 hessian 做了额外参数校验。若采用 Hessian LLE,则要求

$$ k\ge \frac{q(q+3)}{2}+1 \tag{12} $$

若不满足,程序会直接报错终止计算。

4. 代码中的参数与约束

4.1 维度与样本约束

除界面校验外,_prepare_data() 还会再次检查:

$$ q<p \tag{13} $$

$$ k<n \tag{14} $$

$$ k>q \tag{15} $$

因此当前项目不允许“降维维度等于特征数”或“邻居数不超过降维维度”的设置。

4.2 求解器与正则项

项目把以下参数直接传给 LocallyLinearEmbedding

  1. eigen_solver
  2. reg
  3. tol
  4. max_iter
  5. random_state

其中 reg 是求解局部重构权重时的正则项,tolmax_iter 主要控制迭代收敛过程。

5. 评价指标

5.1 重构误差

代码从模型对象上读取 reconstruction_error_,并写入指标表中的“重构误差”。该值越小,通常表示低维嵌入对局部重构关系的保持越好。

从理论表达看,可理解为式(10) 对应目标函数的一个实现输出:

$$ \mathrm{ReconstructionError} \propto \sum_{i=1}^{n}\left\|y_i-\sum_{j\in\mathcal{N}_k(i)} w_{ij}y_j\right\|_2^2 \tag{16} $$

5.2 Trustworthiness

项目还会尝试调用 sklearn.manifold.trustworthiness 计算嵌入可信度。其思想是比较低维近邻关系与原空间近邻关系的一致性。若记用于评价的邻居数为 \(k_t\),则可信度可写为

$$ \mathrm{Trustworthiness} = 1-\frac{2}{n k_t(2n-3k_t-1)} \sum_{i=1}^{n}\sum_{j\in U_i}(r(i,j)-k_t) \tag{17} $$

其中 \(U_i\) 表示在低维空间进入 \(i\) 的近邻、但在高维空间不属于前 \(k_t\) 近邻的样本集合,\(r(i,j)\) 表示样本 \(j\) 在原空间中相对于 \(i\) 的距离排序名次。

需要注意:当前代码并不是用用户设置的 n_neighbors 来算可信度,而是固定采用

$$ k_t=\min(5,n-1) \tag{18} $$

因此结果表中的 Trustworthiness 口径是“以 5 近邻为主的通用可信度”,不是“按当前 LLE 邻居数计算”的可信度。

6. 算法流程

结合当前项目代码,LLE-局部线性嵌入 的实际执行流程如下:

  1. 用户上传 .xlsx.xls.csv 文件;CSV 会依次尝试 utf-8-sigutf-8gbk 编码。
  2. 程序扫描整张表,识别哪些列可完整转为数值型列。
  3. 在“特征设置”页,用户可选一列作为 label_col,并从数值列中勾选参与降维的特征。
  4. 程序检查所选特征列是否存在、是否可数值化、是否有空值、是否为常数列。
  5. 在“算法参数”页设置 n_componentsn_neighborsmethodeigen_solverregtolmax_iterrandom_statenormalize
  6. normalize 选项执行 Min-Max、Z-Score 或不做缩放。
  7. 调用 sklearn.manifold.LocallyLinearEmbedding.fit_transform() 生成低维嵌入。
  8. 读取 reconstruction_error_,并额外计算 Trustworthiness
  9. 生成 EmbeddingMetrics 等结果表,并绘制降维散点图。
  10. 导出 Excel 文件 lle_results.xlsx,并自动生成复现脚本。

7. 关键参数说明

7.1 n_components

目标降维维度,界面允许范围为 1 到 50,默认值为 2。当前实现要求它必须严格小于特征数。

7.2 n_neighbors

邻居数,界面允许范围为 2 到 200,默认值为 10。它直接决定每个样本局部线性重构所参考的近邻规模。当前实现要求:

  1. n_neighbors > n_components
  2. n_neighbors < n_samples
  3. hessian 方法还需满足式(12)

7.3 method

当前支持:

  1. standard
  2. modified
  3. hessian
  4. ltsa

不同方法对局部几何结构的刻画方式不同,结果可能差异明显。

7.4 eigen_solver

当前支持:

  1. auto
  2. arpack
  3. dense

它决定嵌入求解时采用的特征值分解策略。

7.5 reg

正则项,默认值为 \(10^{-3}\)。当局部协方差矩阵接近奇异时,正则项有助于稳定权重求解。

7.6 tolmax_iter

分别表示收敛阈值和最大迭代次数,默认值为 \(10^{-6}\) 和 200。

7.7 random_state

界面显示为“随机种子(0=不固定)”。代码中:

  1. 输入值大于 0 时,传入固定随机种子;
  2. 输入值为 0 时,传入 None,表示不固定。

7.8 normalize

支持:

  1. none
  2. minmax
  3. zscore

当不同特征量纲差异较大时,一般更建议先做 minmaxzscore

8. 输出结果与导出说明

8.1 结果对象

当前代码返回的主要结果包括:

  1. raw_data:原始输入数据;
  2. processed_data:归一化或标准化后的特征矩阵;
  3. step_results.embedding:低维嵌入结果;
  4. step_results.metrics:样本数、特征数、降维维度、重构误差、Trustworthiness;
  5. charts.embedding_scatter:降维散点图路径。

8.2 Excel 工作表

根据 _export_excel() 的实现,导出的 Excel 文件包含:

  1. Parameters
  2. RawData
  3. ProcessedData
  4. Embedding
  5. Metrics
  6. Charts

8.3 图表文件

图表保存在结果目录下的 plots/ 子目录中,当前实现会生成:

  1. embedding_scatter.png

其中:

  1. 若输出维度不少于 2,则绘制前两维散点图;
  2. 若仅输出 1 维,则绘制单轴散点图,但文件名仍为 embedding_scatter.png

9. 论文写作建议

9.1 方法描述模板

“本文采用局部线性嵌入(LLE)方法对高维样本进行非线性降维。首先根据研究变量筛选数值型特征,并进行必要的标准化或归一化处理;随后对每个样本构建 \(k\) 近邻集合,利用邻域内线性重构权重刻画局部流形结构,并在低维空间中保持这些局部重构关系,从而获得低维嵌入表示。本文进一步输出重构误差和 Trustworthiness 指标,用于评价降维结果对局部结构的保持效果。”

9.2 结果解释模板

结果部分可写为:若重构误差较小,通常说明局部线性关系保持较好;若 Trustworthiness 接近 1,则说明低维近邻结构较可信。若二维嵌入图中样本形成清晰的弯曲流形或分层结构,可据此说明 LLE 对非线性结构具有较好的揭示能力。

9.3 图表题注模板

  • 图 1 LLE 降维结果散点图。
  • 表 1 LLE 低维嵌入结果。
  • 表 2 LLE 重构误差与可信度指标。

10. 实现说明与注意事项

  1. LLE 对邻居数非常敏感,n_neighbors 过小可能导致局部结构不稳定,过大则可能破坏局部流形假设。
  2. hessian 方法的邻居数要求更严格,参数设置不当会直接报错。
  3. 当前项目中的 Trustworthiness 固定按 min(5,n-1) 计算,不要误解为与当前 n_neighbors 完全一致。
  4. 若数据中存在异常值、噪声或局部采样极不均匀,LLE 的嵌入结果可能明显波动。
  5. label_col 仅用于结果展示,不参与降维;解释嵌入图时应结合真实业务标签或对象名称一起分析。

11. 单篇终审补充

11.1 图题与表题对齐建议

当前 LLE 模块的真实工作簿包含:

  • Parameters
  • RawData
  • ProcessedData
  • Embedding
  • Metrics
  • Charts

这套输出里,Embedding 是论文中最适合作为核心结果表引用的页;Metrics 则负责承接 reconstruction_error_Trustworthiness。不要再额外虚构“邻接矩阵”或“权重矩阵”表,因为当前程序并未导出这些中间结果。

图文件保存在结果目录下的 plots/ 子目录,当前真实图名为:

  • embedding_scatter.png

因此图题建议直接写成“LLE 低维嵌入散点图”。无论是一维还是二维输出,当前文件名都保持不变;论文图注应根据图形实际维度描述,而不是根据文件名推断二维。

11.2 终审说明

这篇文档最需要强调的是:当前工程实现只导出最终嵌入和评价指标,并未导出 LLE 的局部重构权重矩阵。因此论文中如果需要讲 LLE 的数学原理,可以写权重保持思想,但结果部分不能声称软件直接给出了权重矩阵证据。

另外,当前 repro 脚本已经使用 repro_inputs/... 相对路径,结果目录中可见如 repro_inputs/lle_ui_input.csv 的输入引用。这一口径可以直接用于说明“当前版本支持目录迁移后的复现运行”。

11.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/LLE-局部线性嵌入,本次采用的代表性结果目录为 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320。该目录为单轮输出,主工作簿、图文件、复现脚本和输入副本都在同一目录内。

主结果工作簿为 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320/lle_results.xlsx,实测工作表为:

  • Parameters
  • RawData
  • ProcessedData
  • Embedding
  • Metrics
  • Charts

这套页名再次说明当前实现只把最终低维嵌入和指标输出到 Excel,未输出邻接矩阵、局部权重矩阵或重构权重明细。论文中可以在方法部分写出 LLE 权重求解原理,但结果章节不应声称软件已经导出了这些中间矩阵。

本轮真实图文件为 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320/plots/embedding_scatter.png。因此该轮图题应写为“LLE 低维嵌入散点图”,不要补写不存在的邻域图或权重热力图。

复现实物方面,该目录实际包含:

  • 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320/repro_lle_局部线性嵌入.py
  • 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320/repro_inputs/lle_ui_input.csv

脚本中明确写成 INPUT_FILE = 'repro_inputs/lle_ui_input.csv'。因此这一轮的真实口径是“主结果工作簿已落地,复现脚本使用结果目录内相对路径输入副本”,而不是依赖外部绝对路径。

11. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/聚类与降维/LLE-局部线性嵌入/results/LLE-局部线性嵌入分析结果_20260329_171320
  • 正文应围绕 ParametersRawDataProcessedDataEmbeddingMetricsCharts 来写。
  • 图证应对应 embedding_scatter.png,并把局部线性权重求解与低维嵌入结果区分开。
  • 复现脚本应按 repro_lle_局部线性嵌入.py + repro_inputs/lle_ui_input.csv 的口径说明。