正在加载中...

展开本页目录
算法教程MDS-多维尺度

MDS-多维尺度

No.126 · 在线教程

多维尺度分析(Multi-Dimensional Scaling, MDS)是一类根据样本之间的相似性或距离关系来构造低维表示的方法。其目标不是直接对原始特征做线性投影,而是在低维空间中寻找一组坐标,使低维空间中的样本间距离尽可能逼近原始空间中的距离关系。

MDS-多维尺度

1. 方法概述

多维尺度分析(Multi-Dimensional Scaling, MDS)是一类根据样本之间的相似性或距离关系来构造低维表示的方法。其目标不是直接对原始特征做线性投影,而是在低维空间中寻找一组坐标,使低维空间中的样本间距离尽可能逼近原始空间中的距离关系。

本项目中的 MDS-多维尺度 模块并不是调用 sklearn.manifold.MDS 的 SMACOF 迭代算法,而是实现了Classical MDS 路线:先计算成对距离矩阵,再对距离平方矩阵进行双中心化,最后对得到的 Gram 型矩阵做特征分解,从而得到低维嵌入。

当前模块的实际特征包括:

  1. 固定读取第 1 列为样本 ID,后续选中特征参与计算;
  2. 支持 euclideanmanhattan 两种距离度量;
  3. 支持可选 z-score 标准化;
  4. 通过双中心化与特征分解实现 classical MDS;
  5. 输出距离矩阵、特征值、残差方差、Stress 和二维嵌入图。

设共有 \(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.pyindicators_widget.pydata_validator.py 的实现,模块对输入数据的真实要求如下:

  1. 数据不能为空;
  2. 至少包含两列,即样本 ID 和至少一个特征列;
  3. 第 1 列样本 ID 必须唯一;
  4. 第 2 列及以后必须为数值型;
  5. 特征列不能含空值;
  6. 至少选择 1 个特征;
  7. 真正开始计算时还要求样本数至少为 3。

2.2 Z-score 标准化

若勾选 standardize=True,则程序按列执行

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

其中 \(\mu_j\) 为第 \(j\) 个特征均值,\(\sigma_j\) 为总体标准差。若某列标准差为 0,代码会把它替换为 1,以避免除零问题。

若未勾选标准化,则直接令

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

从而得到实际进入 MDS 的特征矩阵

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

2.3 符号说明

符号 含义
\(n\) 样本数量
\(p\) 特征维数
\(q\) 目标降维维度 n_components
\(z_i\) 第 \(i\) 个样本的预处理后特征向量
\(d_{ij}\) 样本 \(i,j\) 之间的原空间距离
\(D\) 成对距离矩阵
\(B\) 双中心化后的矩阵
\(\lambda_r\) 第 \(r\) 个特征值
\(v_r\) 第 \(r\) 个特征向量
\(y_i\) 第 \(i\) 个样本的低维坐标

3. 核心数学模型

3.1 成对距离矩阵

程序首先在预处理后的矩阵 \(Z\) 上计算样本两两距离。若使用欧氏距离,则

$$ d_{ij}=\|z_i-z_j\|_2 \tag{5} $$

若使用曼哈顿距离,则代码内部把 manhattan 映射为 cityblock,即

$$ d_{ij}=\|z_i-z_j\|_1=\sum_{r=1}^{p}|z_{ir}-z_{jr}| \tag{6} $$

由此构造距离矩阵

$$ D=(d_{ij})_{n\times n} \tag{7} $$

3.2 距离平方双中心化

Classical MDS 的关键是把距离矩阵转为一个内积型矩阵。记

$$ J=I_n-\frac{1}{n}\mathbf{1}\mathbf{1}^\top \tag{8} $$

则双中心化矩阵为

$$ B=-\frac{1}{2}J(D\odot D)J \tag{9} $$

其中 \(\odot\) 表示按元素平方。代码中还会把 NaNInf 强制置为 0,再执行特征分解。

3.3 特征分解与低维嵌入

对矩阵 \(B\) 求解特征分解:

$$ B=V\Lambda V^\top \tag{10} $$

将特征值按从大到小排序,仅保留正特征值。若正特征值个数记为 \(q^\ast\),且用户请求维度为 \(q\),则实际输出维度为

$$ \tilde q=\min(q,q^\ast) \tag{11} $$

最终低维坐标矩阵写为

$$ Y= \begin{bmatrix} \sqrt{\lambda_1}v_1 & \sqrt{\lambda_2}v_2 & \cdots & \sqrt{\lambda_{\tilde q}}v_{\tilde q} \end{bmatrix} \tag{12} $$

若不存在正特征值,当前实现会退化为返回 1 维零向量嵌入。

项目导出的低维坐标列名为 Dim1Dim2、…,对应 低维嵌入 工作表。

4. 评价指标

4.1 残差方差

程序会比较原始距离矩阵 \(D\) 与低维欧氏距离矩阵 \(D^{(e)}\)。若低维空间中的距离记为

$$ d_{ij}^{(e)}=\|y_i-y_j\|_2 \tag{13} $$

对上三角距离向量的相关系数记为 \(\rho\),则项目中的残差方差定义为

$$ \mathrm{ResidualVariance}=1-\rho^2 \tag{14} $$

该值越小,通常表示低维嵌入越好地保持了原始距离结构。

4.2 Stress

项目同时输出应力指标:

$$ \mathrm{Stress}= \sqrt{ \frac{\sum_{i<j}(d_{ij}-d_{ij}^{(e)})^2} {\sum_{i<j}d_{ij}^2} } \tag{15} $$

Stress 越小,一般表示低维距离与原始距离更一致。

4.3 总样本数

项目还会在指标表中写入

$$ \text{total\_samples}=n \tag{16} $$

用于说明当前嵌入覆盖的样本规模。

5. 代码实现细节

5.1 这不是 sklearn.manifold.MDS

这一点需要特别说明。当前模块没有调用 sklearn.manifold.MDS,也没有暴露 dissimilarityn_initmax_iternormalized_stress 等 SMACOF 参数。它实现的是 classical MDS,因此:

  1. 直接从距离矩阵出发做特征分解;
  2. 不存在 SMACOF 的多次随机初始化;
  3. Stress 是项目后验计算出来的拟合指标,不是 SMACOF 的优化目标值。

5.2 实际输出维度可能小于请求维度

由于代码只保留正特征值对应方向,若正特征值数量少于用户请求的 n_components,则实际输出维度会自动变小,且 parameters["n_components"] 会记录修正后的维度。

6. 算法流程

结合当前项目代码,MDS-多维尺度 的实际执行流程如下:

  1. 读取 .xlsx.xls.csv 文件;CSV 会依次尝试 utf-8-sigutf-8gbk 编码。
  2. 校验数据结构:首列样本 ID 唯一,其余列必须为无空值数值型特征。
  3. 在“特征选择”页从第 2 列开始勾选参与降维的特征。
  4. 在“方法设置”页设置 n_componentsmetric 与是否标准化。
  5. 若勾选标准化,则按式(2) 对特征矩阵做 z-score 变换。
  6. euclideanmanhattan 计算成对距离矩阵 \(D\)。
  7. 对 \(D\) 做双中心化,得到矩阵 \(B\)。
  8. 对 \(B\) 做特征分解,截取正特征值方向,得到低维嵌入坐标。
  9. 计算残差方差、Stress 和样本数等评价指标。
  10. 生成距离矩阵、特征值表、低维嵌入表和二维散点图。
  11. 导出 Excel 文件 MDS_results_<时间戳>.xlsx,并自动生成复现脚本。

7. 关键参数说明

7.1 n_components

目标降维维度,界面允许范围为 1 到 50,默认值为 2。需要注意:

  1. 这是“期望输出维度”;
  2. 若正特征值不足,最终实际维度会小于该值。

7.2 metric

当前支持:

  1. euclidean
  2. manhattan

该参数直接决定原始距离矩阵 \(D\) 的构造方式,因此会显著影响最终嵌入形状。

7.3 standardize

是否执行 z-score 标准化,默认勾选。若不同特征量纲差异明显,通常建议保持开启。

8. 输出结果与导出说明

8.1 Excel 工作表

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

  1. 原始数据
  2. 处理后数据
  3. 低维嵌入
  4. 特征值
  5. 评价指标
  6. 距离矩阵
  7. 参数设置
  8. 图表清单

8.2 图表文件

若实际输出维度不少于 2,程序会在结果目录下生成:

  1. MDS_plots_<时间戳>/embedding_2d.png

若实际输出维度只有 1,则不会生成二维散点图。

8.3 结果对象

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

  1. raw_data:原始输入数据(样本 ID + 选中特征);
  2. processed_data:标准化后的特征矩阵;
  3. final_results:低维嵌入坐标表;
  4. step_results.distance_matrix:全样本距离矩阵;
  5. step_results.eigenvalues:特征值表;
  6. step_results.metrics:残差方差、Stress、总样本数;
  7. parameters:维度、距离度量、标准化开关及均值方差等信息。

9. 论文写作建议

9.1 方法描述模板

“本文采用多维尺度分析(MDS)方法对样本进行降维表示。首先根据选定特征计算样本之间的距离矩阵,并在必要时对原始特征执行标准化处理;随后采用 classical MDS 路线,对距离平方矩阵进行双中心化并做特征分解,提取前若干个低维坐标作为样本嵌入表示。为评价嵌入质量,本文进一步计算残差方差与 Stress 指标,用于衡量低维距离对原始距离结构的保持程度。”

9.2 结果解释模板

结果部分可写为:若 ResidualVarianceStress 都较小,通常说明 MDS 嵌入较好地保持了原始距离结构;若前几个特征值明显大于其余特征值,则说明主要空间结构集中在较少维度中。若二维嵌入图中样本形成明显分组或梯度分布,可进一步结合业务标签解释距离结构。

9.3 图表题注模板

  • 图 1 MDS 二维嵌入散点图。
  • 表 1 MDS 特征值结果。
  • 表 2 MDS 嵌入质量评价指标。

10. 实现说明与注意事项

  1. 当前模块实现的是 classical MDS,而不是非度量 MDS 或 SMACOF 迭代版;论文中描述时不要混用。
  2. 若原始距离关系本身难以被低维欧氏空间表示,即使算法正确,Stress 也可能依然较高。
  3. manhattaneuclidean 可能对应完全不同的空间几何关系,实际分析中应结合问题背景选用。
  4. 当特征量纲差异明显时,不做标准化往往会让大尺度变量主导距离矩阵。
  5. 若正特征值数量不足,实际输出维度会变小,这属于当前实现的正常行为,不是程序异常。

11. 单篇终审补充

11.1 图题与表题对齐建议

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

  • 原始数据
  • 处理后数据
  • 低维嵌入
  • 特征值
  • 评价指标
  • 距离矩阵
  • 参数设置
  • 图表清单

其中 距离矩阵低维嵌入 是最适合在论文中形成“输入距离结构 + 输出嵌入结构”对应关系的两张核心表;参数设置 则建议放在附录或方法说明中引用。不要把 特征值 误写成 PCA 意义下的协方差特征值,它来自 MDS 双中心化矩阵的特征分解。

图文件保存在结果目录下的 MDS_plots_<时间戳>/ 子目录,当前实现真实图名为:

  • embedding_2d.png

但只有当实际输出维度不少于 2 时才会生成这张图。因此图题建议写成“MDS 二维嵌入散点图”;若本次运行实际只有 1 维输出,则正文不应继续保留这张图的占位描述。

11.2 终审说明

这篇文档最需要避免的误写,是把当前实现当成 SMACOF 迭代版 MDS。代码明确走的是 classical MDS 路线:先构造距离矩阵,再双中心化并做特征分解。因此结果解释应围绕 eigenvaluesResidualVarianceStress 展开,而不是写“迭代收敛过程”。

另外,当前 repro 脚本已经稳定采用 repro_inputs/... 相对路径,结果目录中可见如 repro_inputs/mds_sample.xlsx 的输入副本引用。这一点说明当前新结果目录已经满足迁移式复现要求。

11.3 全量强化补充

本篇终审补充绑定的真实算法目录为 具体的算法3/聚类与降维/MDS-多维尺度。由于 results/MDS-多维尺度_UIFlow_20260306_01 是多轮 UIFlow 结果池,容易混入多个时间戳工作簿,本次优先采用更干净的结果目录 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339 做证据绑定。

该目录下存在两份连续时间戳工作簿:

  • 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/MDS_results_20260322_032339.xlsx
  • 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/MDS_results_20260322_032340.xlsx

复现脚本里实际写的是 OUTPUT_FILE = 'MDS_results_20260322_032339.xlsx',因此本篇证据绑定以 MDS_results_20260322_032339.xlsx 作为主结果工作簿。两份工作簿实测工作表一致,均包含:

  • 原始数据
  • 处理后数据
  • 低维嵌入
  • 特征值
  • 评价指标
  • 距离矩阵
  • 参数设置
  • 图表清单

该页名对应 classical MDS 的真实工程流程:距离矩阵 记录输入距离结构,低维嵌入 记录输出坐标,特征值 来自双中心化矩阵分解。这里不能把 特征值 写成 PCA 协方差矩阵特征值,也不能写成 SMACOF 迭代收敛日志。

该目录中实际存在两套图目录:

  • 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/MDS_plots_20260322_032339/embedding_2d.png
  • 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/MDS_plots_20260322_032340/embedding_2d.png

主绑定工作簿为 MDS_results_20260322_032339.xlsx 时,正文图证据也应优先对应 MDS_plots_20260322_032339/embedding_2d.pngMDS_plots_20260322_032340/embedding_2d.png 更适合作为同目录内再运行或连续导出的补充产物,不应混成同一张主图。

复现实物方面,该目录实际包含 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/repro_mds_多维尺度.py具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339/repro_inputs/mds_sample.xlsx。脚本内明确写成 INPUT_FILE = 'repro_inputs/mds_sample.xlsx',这说明复现入口已经使用结果目录内部输入副本,而不是外部绝对路径。

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

  • 当前主结果目录应写作 具体的算法3/聚类与降维/MDS-多维尺度/results/MDS-多维尺度分析结果_20260322_032339
  • 正文应围绕 Parameters原始数据处理后数据低维嵌入特征值评价指标距离矩阵图表清单 来写。
  • 图证应对应 embedding_2d.png,并把双中心化后的特征值分解与低维坐标解释清楚。
  • 复现脚本应按 repro_mds_多维尺度.py + repro_inputs/mds_sample.xlsx 的口径说明。