LLE-局部线性嵌入
局部线性嵌入(Locally Linear Embedding, LLE)是一类经典的流形学习方法。它的核心思想是:高维样本虽然整体分布可能是非线性的,但在每个样本的局部邻域内往往仍近似服从线性结构。LLE 先在原空间中用邻域重构权重刻画这种局部线性关系,再在低维空间中尽量保持…
LLE-局部线性嵌入
1. 方法概述
局部线性嵌入(Locally Linear Embedding, LLE)是一类经典的流形学习方法。它的核心思想是:高维样本虽然整体分布可能是非线性的,但在每个样本的局部邻域内往往仍近似服从线性结构。LLE 先在原空间中用邻域重构权重刻画这种局部线性关系,再在低维空间中尽量保持这些重构关系,从而得到非线性降维结果。
本项目中的 LLE-局部线性嵌入 模块并不是自写 LLE 求解器,而是对 sklearn.manifold.LocallyLinearEmbedding 的工程化封装。当前代码支持:
standard、modified、hessian、ltsa四种 LLE 方法;auto、arpack、dense三种特征分解策略;none、minmax、zscore三种特征预处理方式;- 输出低维嵌入、重构误差、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.py、indicators_widget.py 与 data_validator.py 的实现,模块对输入数据的真实要求如下:
- 数据不能为空;
- 数据中至少存在 1 列可以完整转成数值的列;
- 选择的特征列必须存在;
- 特征列不能含空值或非数值项;
- 特征列不能是常数列;
- 至少选择 1 个特征;
- 真正进入计算时还要求: \(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} $$
项目最终导出的嵌入列名为 LLE1、LLE2、…,对应 Embedding 工作表。
3.3 四种 LLE 变体
当前项目把 method 直接传给 sklearn.manifold.LocallyLinearEmbedding,支持以下四种变体:
standardmodifiedhessianltsa
其中:
standard是最经典的局部重构权重保持形式;modified是对标准 LLE 的改进版本;hessian对曲率结构更敏感;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:
eigen_solverregtolmax_iterrandom_state
其中 reg 是求解局部重构权重时的正则项,tol 与 max_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-局部线性嵌入 的实际执行流程如下:
- 用户上传
.xlsx、.xls或.csv文件;CSV 会依次尝试utf-8-sig、utf-8、gbk编码。 - 程序扫描整张表,识别哪些列可完整转为数值型列。
- 在“特征设置”页,用户可选一列作为
label_col,并从数值列中勾选参与降维的特征。 - 程序检查所选特征列是否存在、是否可数值化、是否有空值、是否为常数列。
- 在“算法参数”页设置
n_components、n_neighbors、method、eigen_solver、reg、tol、max_iter、random_state与normalize。 - 按
normalize选项执行 Min-Max、Z-Score 或不做缩放。 - 调用
sklearn.manifold.LocallyLinearEmbedding.fit_transform()生成低维嵌入。 - 读取
reconstruction_error_,并额外计算Trustworthiness。 - 生成
Embedding、Metrics等结果表,并绘制降维散点图。 - 导出 Excel 文件
lle_results.xlsx,并自动生成复现脚本。
7. 关键参数说明
7.1 n_components
目标降维维度,界面允许范围为 1 到 50,默认值为 2。当前实现要求它必须严格小于特征数。
7.2 n_neighbors
邻居数,界面允许范围为 2 到 200,默认值为 10。它直接决定每个样本局部线性重构所参考的近邻规模。当前实现要求:
n_neighbors > n_componentsn_neighbors < n_samples- 对
hessian方法还需满足式(12)
7.3 method
当前支持:
standardmodifiedhessianltsa
不同方法对局部几何结构的刻画方式不同,结果可能差异明显。
7.4 eigen_solver
当前支持:
autoarpackdense
它决定嵌入求解时采用的特征值分解策略。
7.5 reg
正则项,默认值为 \(10^{-3}\)。当局部协方差矩阵接近奇异时,正则项有助于稳定权重求解。
7.6 tol 与 max_iter
分别表示收敛阈值和最大迭代次数,默认值为 \(10^{-6}\) 和 200。
7.7 random_state
界面显示为“随机种子(0=不固定)”。代码中:
- 输入值大于 0 时,传入固定随机种子;
- 输入值为 0 时,传入
None,表示不固定。
7.8 normalize
支持:
noneminmaxzscore
当不同特征量纲差异较大时,一般更建议先做 minmax 或 zscore。
8. 输出结果与导出说明
8.1 结果对象
当前代码返回的主要结果包括:
raw_data:原始输入数据;processed_data:归一化或标准化后的特征矩阵;step_results.embedding:低维嵌入结果;step_results.metrics:样本数、特征数、降维维度、重构误差、Trustworthiness;charts.embedding_scatter:降维散点图路径。
8.2 Excel 工作表
根据 _export_excel() 的实现,导出的 Excel 文件包含:
ParametersRawDataProcessedDataEmbeddingMetricsCharts
8.3 图表文件
图表保存在结果目录下的 plots/ 子目录中,当前实现会生成:
embedding_scatter.png
其中:
- 若输出维度不少于 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. 实现说明与注意事项
- LLE 对邻居数非常敏感,
n_neighbors过小可能导致局部结构不稳定,过大则可能破坏局部流形假设。 hessian方法的邻居数要求更严格,参数设置不当会直接报错。- 当前项目中的
Trustworthiness固定按min(5,n-1)计算,不要误解为与当前n_neighbors完全一致。 - 若数据中存在异常值、噪声或局部采样极不均匀,LLE 的嵌入结果可能明显波动。
label_col仅用于结果展示,不参与降维;解释嵌入图时应结合真实业务标签或对象名称一起分析。
11. 单篇终审补充
11.1 图题与表题对齐建议
当前 LLE 模块的真实工作簿包含:
ParametersRawDataProcessedDataEmbeddingMetricsCharts
这套输出里,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,实测工作表为:
ParametersRawDataProcessedDataEmbeddingMetricsCharts
这套页名再次说明当前实现只把最终低维嵌入和指标输出到 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。 - 正文应围绕
Parameters、RawData、ProcessedData、Embedding、Metrics、Charts来写。 - 图证应对应
embedding_scatter.png,并把局部线性权重求解与低维嵌入结果区分开。 - 复现脚本应按
repro_lle_局部线性嵌入.py + repro_inputs/lle_ui_input.csv的口径说明。