Isomap-Isomap
Isomap(Isometric Mapping)是一类典型的非线性流形降维方法。它的基本思想不是直接在原始高维欧氏距离上做线性投影,而是先在样本邻域图上估计测地距离,再对测地距离矩阵执行经典多维尺度分析(Classical MDS),从而在低维空间中尽可能保持流形上的几何结构。
Isomap-Isomap
1. 方法概述
Isomap(Isometric Mapping)是一类典型的非线性流形降维方法。它的基本思想不是直接在原始高维欧氏距离上做线性投影,而是先在样本邻域图上估计测地距离,再对测地距离矩阵执行经典多维尺度分析(Classical MDS),从而在低维空间中尽可能保持流形上的几何结构。
本项目中的 Isomap-Isomap 模块并不是直接调用 sklearn.manifold.Isomap,而是按以下步骤实现了一套自写流程:
- 从数据表中选择特征列,并可选执行
z-score标准化; - 用
scipy.spatial.distance.cdist计算样本两两欧氏距离; - 按
n_neighbors构造 k 近邻图,并对图进行对称化; - 若近邻图不连通,仅保留最大连通分量参与 Isomap 主计算;
- 调用
scipy.sparse.csgraph.shortest_path计算图上的最短路径测地距离; - 对测地距离矩阵执行双中心化和特征分解,得到低维嵌入;
- 对被排除在最大连通分量之外的样本,在最终嵌入表中以
NaN填充。
设共有 \(n\) 个样本、\(p\) 个被选中的数值特征。记原始特征矩阵为
$$ X=(x_{ij})_{n\times p},\quad i=1,2,\ldots,n,\ j=1,2,\ldots,p \tag{1} $$
其中程序约定第 1 列为样本 ID/名称列,不参与降维;用户可在“特征选择”页从其余列中勾选任意特征参与计算。
2. 数据要求与预处理
2.1 数据约束
根据当前 upload_widget.py、indicators_widget.py 与 data_validator.py 的实现,模块对输入数据有如下要求:
- 数据表不能为空;
- 至少包含两列,即第 1 列样本名称和至少 1 列特征;
- 第 1 列样本名称必须唯一;
- 第 2 列及以后必须为数值列,且不能含空值;
- 至少选择 1 个特征列;
- 真正进入计算时,样本数还必须满足 \(n\ge 3\)。
2.2 标准化
若界面勾选 standardize=True,则程序对每个特征执行总体标准差意义下的 z-score 标准化:
$$ z_{ij}=\frac{x_{ij}-\mu_j}{\sigma_j} \tag{2} $$
其中 \(\mu_j\) 为第 \(j\) 个特征的均值,\(\sigma_j\) 为总体标准差。若某个特征满足 \(\sigma_j=0\),代码会将其替换为 1,以避免除零错误。
若 standardize=False,则直接令
$$ z_{ij}=x_{ij} \tag{3} $$
记预处理后用于构图和降维的矩阵为
$$ Z=(z_{ij})_{n\times p} \tag{4} $$
2.3 符号说明
| 符号 | 含义 |
|---|---|
| \(n\) | 样本数量 |
| \(p\) | 特征维数 |
| \(z_i\) | 第 \(i\) 个样本的预处理后特征向量 |
| \(k\) | 邻居数 n_neighbors |
| \(q\) | 目标降维维度 n_components |
| \(d_{ij}\) | 样本 \(i,j\) 的欧氏距离 |
| \(G\) | k 近邻图对应的加权邻接矩阵 |
| \(\mathcal{C}\) | 最大连通分量对应的样本索引集合 |
| \(D^{(g)}\) | 测地距离矩阵 |
| \(B\) | Classical MDS 的双中心化矩阵 |
| \(\lambda_r\) | 第 \(r\) 个特征值 |
| \(v_r\) | 第 \(r\) 个特征向量 |
| \(Y\) | Isomap 得到的低维嵌入坐标矩阵 |
3. 核心数学模型
3.1 两两欧氏距离
程序首先基于预处理后的样本矩阵 \(Z\) 计算成对欧氏距离:
$$ d_{ij}=\|z_i-z_j\|_2 \tag{5} $$
得到距离矩阵
$$ D=(d_{ij})_{n\times n} \tag{6} $$
当前实现固定使用欧氏距离,不提供其他距离度量选项。
3.2 k 近邻图构造与对称化
对每个样本 \(i\),程序在第 \(i\) 行距离中保留除自身外最近的 \(k\) 个邻居,其中
$$ k=\min\{\texttt{n\_neighbors},\, n-1\} \tag{7} $$
也就是说,即使界面输入的 n_neighbors 大于 \(n-1\),计算时也会自动截断到 \(n-1\)。
构造初始邻接矩阵 \(G^{(0)}=(g_{ij}^{(0)})\):
$$ g_{ij}^{(0)}= \begin{cases} 0, & i=j,\\ d_{ij}, & j\in \mathcal{N}_k(i),\\ \infty, & \text{otherwise} \end{cases} \tag{8} $$
其中 \(\mathcal{N}_k(i)\) 表示样本 \(i\) 的 k 个最近邻索引集合。随后程序做无向图对称化:
$$ g_{ij}=\min\left(g_{ij}^{(0)},\, g_{ji}^{(0)}\right) \tag{9} $$
从而得到最终用于最短路径计算的无向加权图 \(G=(g_{ij})\)。
3.3 最大连通分量提取
当前实现不会在不连通图上强行做全样本 Isomap,而是先根据有限边构造连通关系,仅保留最大连通分量 \(\mathcal{C}\)。若图中共有多个连通分量,程序选择样本数最大的那个:
$$ \mathcal{C}=\arg\max_{\mathcal{C}_m} |\mathcal{C}_m| \tag{10} $$
然后仅对 \(\mathcal{C}\) 中样本对应的子图执行后续测地距离与 MDS 计算。若 \(|\mathcal{C}|<n\),日志中会给出“仅对最大连通分量执行 Isomap”的警告。
3.4 测地距离估计
在最大连通分量子图上,程序使用 scipy.sparse.csgraph.shortest_path 计算任意两点之间的最短路径距离,并作为流形上的测地距离近似:
$$ d_{ij}^{(g)}=\min_{\pi:i\rightsquigarrow j}\sum_{(u,v)\in \pi} g_{uv} \tag{11} $$
进而得到测地距离矩阵
$$ D^{(g)}=\left(d_{ij}^{(g)}\right)_{|\mathcal{C}|\times |\mathcal{C}|} \tag{12} $$
这一步是 Isomap 区别于 PCA、SVD、Classical MDS 直接欧氏建模的关键。
3.5 Classical MDS 双中心化
程序对测地距离平方矩阵执行双中心化。记
$$ J=I-\frac{1}{m}\mathbf{1}\mathbf{1}^\top,\quad m=|\mathcal{C}| \tag{13} $$
则双中心化矩阵为
$$ B=-\frac{1}{2}J\left(D^{(g)}\odot D^{(g)}\right)J \tag{14} $$
其中 \(\odot\) 表示按元素平方。代码中还会把 NaN 与 Inf 替换为 0,再执行对称矩阵特征分解。
3.6 特征分解与低维嵌入
对矩阵 \(B\) 做特征分解:
$$ B=V\Lambda V^\top \tag{15} $$
将特征值按从大到小排序,仅保留正特征值。若正特征值个数少于用户设定的目标维度 \(q\),则程序会自动把实际输出维度降到正特征值个数。
设保留的前 \(q^\ast\) 个正特征值为 \(\lambda_1,\ldots,\lambda_{q^\ast}\),对应特征向量为 \(v_1,\ldots,v_{q^\ast}\),则低维嵌入坐标为
$$ Y= \begin{bmatrix} \sqrt{\lambda_1}v_1 & \sqrt{\lambda_2}v_2 & \cdots & \sqrt{\lambda_{q^\ast}}v_{q^\ast} \end{bmatrix} \tag{16} $$
若不存在正特征值,当前实现会返回 1 维零向量嵌入。
3.7 非连通样本的结果回填
程序最终会把最大连通分量上得到的嵌入坐标回填到全体样本位置,对未进入 \(\mathcal{C}\) 的样本填充 NaN:
$$ \tilde y_i= \begin{cases} y_i, & i\in \mathcal{C},\\ \mathrm{NaN}, & i\notin \mathcal{C} \end{cases} \tag{17} $$
因此,最终导出的 低维嵌入 工作表是全样本表,而 测地距离矩阵 则仅覆盖最大连通分量中的样本。
4. 评价指标
4.1 残差方差
代码会在最大连通分量内部,将测地距离与嵌入空间欧氏距离进行比较。记嵌入后的欧氏距离为
$$ d_{ij}^{(e)}=\|y_i-y_j\|_2 \tag{18} $$
若上三角距离向量的相关系数为 \(\rho\),则残差方差定义为
$$ \mathrm{ResidualVariance}=1-\rho^2 \tag{19} $$
该值越小,通常表示低维嵌入越好地保持了测地距离结构。
4.2 Stress
项目同时输出经典应力指标:
$$ \mathrm{Stress}= \sqrt{ \frac{\sum_{i<j}\left(d_{ij}^{(g)}-d_{ij}^{(e)}\right)^2} {\sum_{i<j}\left(d_{ij}^{(g)}\right)^2} } \tag{20} $$
Stress 越小,表示嵌入距离与测地距离越一致。
4.3 连通性指标
结果中还会输出:
$$ \text{connected\_component\_size}=|\mathcal{C}|,\qquad \text{total\_samples}=n \tag{21} $$
这两个指标用于判断有多少样本真正参与了 Isomap 主计算。
5. 算法流程
结合当前项目代码,Isomap-Isomap 的实际执行流程如下:
- 读取
.xlsx、.xls或.csv数据文件;CSV 优先按utf-8-sig读取,失败后回退到gbk。 - 校验数据结构:第 1 列样本 ID 唯一,其余列为无空值数值型特征。
- 在“特征选择”页从第 2 列开始勾选参与降维的特征列。
- 在“方法设置”页配置
n_neighbors、n_components与是否标准化。 - 根据
standardize决定是否执行式(2) 的z-score标准化。 - 计算样本两两欧氏距离,并按式(8) 构造 k 近邻图,再按式(9) 对称化。
- 检查近邻图连通性;若不连通,仅保留最大连通分量。
- 在最大连通分量上计算最短路径测地距离矩阵 \(D^{(g)}\)。
- 对 \(D^{(g)}\) 执行 Classical MDS,得到低维嵌入 \(Y\)。
- 计算残差方差、Stress、连通分量规模等指标。
- 导出 Excel 结果文件与
embedding_2d.png图;若有效维度少于 2,则不会生成二维散点图。 - 自动写出复现脚本
repro_isomap_isomap.py。
6. 关键参数说明
6.1 n_neighbors
近邻数,界面允许范围为 2 到 200,默认值为 12。该参数决定局部邻域图的稀疏程度:
- 取值过小,近邻图更容易断裂;
- 取值过大,测地距离会逐渐退化为原始欧氏距离;
- 实际计算时会自动截断到 \(n-1\)。
6.2 n_components
目标降维维度,界面允许范围为 1 到 50,默认值为 2。需要注意:
- 这是“期望输出维度”,不是绝对保证值;
- 若双中心化矩阵正特征值个数不足,最终输出维度会小于该值。
6.3 standardize
是否对特征执行 z-score 标准化,默认勾选。若不同特征量纲差异明显,一般建议保持开启;若原始特征已具有统一量纲,也可以关闭。
7. 输出结果与导出说明
7.1 结果对象
当前代码返回的核心结果包括:
raw_data:原始输入数据(样本 ID + 选中特征);processed_data:标准化后的数据;final_results:最终低维嵌入表,列名为Dim1、Dim2等;step_results.knn_graph:全样本邻接距离矩阵;step_results.geodesic_distances:最大连通分量上的测地距离矩阵;step_results.eigenvalues:全部特征值;step_results.metrics:残差方差、Stress、连通分量规模等指标;step_results.component_index:最大连通分量样本索引;charts.embedding_2d:二维嵌入散点图。
7.2 Excel 工作表
根据 save_results() 的实现,导出的 Excel 文件包含以下工作表:
Parameters原始数据处理后数据低维嵌入特征值评价指标邻接距离矩阵测地距离矩阵Charts
其中 Charts 表记录导出图片的名称与路径;图片文件保存在同级目录下的 Isomap_plots_<时间戳>/embedding_2d.png。
8. 论文写作建议
8.1 方法描述模板
“本文采用 Isomap 方法对高维样本进行非线性流形降维。首先基于标准化后的特征构造 k 近邻图,并以图最短路径近似样本间测地距离;随后对测地距离矩阵执行经典多维尺度分析,得到低维嵌入坐标。为保证测地距离有效性,本文实现中仅对最大连通分量执行 Isomap 计算,并输出残差方差与 Stress 指标评估嵌入质量。”
8.2 结果解释模板
结果部分可写为:若 connected_component_size < total_samples,应在正文中明确说明部分样本因邻域图不连通而未参与主嵌入。若 ResidualVariance 与 Stress 同时较小,通常可认为 Isomap 较好地保留了原始流形结构;若二维嵌入图中不同样本簇出现明显分离,则可进一步结合聚类或分类任务解释低维空间中的结构差异。
8.3 图表题注模板
- 图 1 Isomap 二维嵌入散点图。
- 表 1 Isomap 特征值与有效降维维度结果。
- 表 2 Isomap 嵌入质量评价指标(Residual Variance、Stress)。
9. 实现说明与注意事项
- Isomap 对邻居数较敏感,
n_neighbors过小容易导致近邻图断裂,过大则可能削弱非线性流形优势。 - 当前项目固定使用欧氏距离构图,不适用于必须使用专门距离度量的场景。
- 若样本规模较大,邻接距离矩阵与测地距离矩阵会显著增大,导出 Excel 的体量也会随之增加。
- 当最大连通分量之外仍有样本时,最终嵌入表会出现
NaN,后续若做聚类、回归或可视化,需先明确这些样本的处理策略。
10. 单篇终审补充
10.1 图题与表题对齐建议
当前 Isomap 模块的真实工作簿包含:
Parameters原始数据处理后数据低维嵌入特征值评价指标邻接距离矩阵测地距离矩阵Charts
其中 邻接距离矩阵 与 测地距离矩阵 是这篇文档区别于 PCA、MDS 这类降维算法的关键结果页,论文里如果只展示 低维嵌入 而不说明“近邻图距离”和“测地距离”的差异,会削弱 Isomap 的方法特征。
图文件保存在结果目录下的 Isomap_plots_<suffix>/ 子目录,当前真实图名为:
embedding_2d.png
因此图题建议直接写成“Isomap 二维嵌入结果图”或“Isomap 低维流形嵌入散点图”。不要写成“主成分得分图”或“核映射结果图”,这与当前实现无关。
10.2 终审说明
这篇文档需要强调一个工程事实:当前 save_results() 会把所有样本的 final_results 导出到 低维嵌入,但真正参与 Isomap 特征分解的是最大连通分量。连通分量之外的样本在最终表中可能出现 NaN,这不是程序错误,而是当前实现对断裂近邻图的显式保留。
另外,当前图表只有 embedding_2d.png 一张,并未导出近邻图结构图或残差方差曲线图。因此论文图注部分应聚焦“二维嵌入分布”,而把 ResidualVariance、Stress 等指标放在 评价指标 表中解释,不要虚构额外图形。
10.3 全量强化补充
本次全量强化绑定的真实结果目录为 具体的算法3/聚类与降维/Isomap-Isomap/results/Isomap-Isomap分析结果_20260329_171303。主结果文件为 Isomap_results_20260329_171303.xlsx,实际工作表依次为 Parameters、原始数据、处理后数据、低维嵌入、特征值、评价指标、邻接距离矩阵、测地距离矩阵、Charts。
当前主图文件为 Isomap_plots_20260329_171303/embedding_2d.png。该目录同时包含 repro_inputs/isomap_ui_input.csv 与 repro_isomap_isomap.py,脚本里写死的输入口径为 INPUT_FILE = 'repro_inputs/isomap_ui_input.csv',因此这篇文档可以明确归类为“真实上传数据驱动 + 相对路径复现”模式,而不是 benchmark 函数模式。
从当前真实结果看,Isomap 这一篇没有出现二次嵌套导出目录,主结果目录结构比较干净:一个主工作簿、一个主图目录、一个 repro_inputs 子目录和一个复现脚本。论文正文若引用工程结果,建议优先引用 Isomap_results_20260329_171303.xlsx 与 Isomap_plots_20260329_171303/embedding_2d.png,并把 邻接距离矩阵、测地距离矩阵 写成 Isomap 特有的中间证据页,而不是泛化成普通降维算法都存在的通用输出。
11. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/聚类与降维/Isomap-Isomap/results/Isomap-Isomap分析结果_20260329_171303。 - 正文应围绕
Parameters、原始数据、处理后数据、低维嵌入、特征值、评价指标、邻接距离矩阵、测地距离矩阵、Charts来写。 - 图证应对应
embedding_2d.png,并把连通分量和不可嵌入样本的NaN口径说明清楚。 - 复现脚本应按
repro_isomap_isomap.py + repro_inputs/isomap_ui_input.csv的口径说明。