MDS-多维尺度
多维尺度分析(Multi-Dimensional Scaling, MDS)是一类根据样本之间的相似性或距离关系来构造低维表示的方法。其目标不是直接对原始特征做线性投影,而是在低维空间中寻找一组坐标,使低维空间中的样本间距离尽可能逼近原始空间中的距离关系。
MDS-多维尺度
1. 方法概述
多维尺度分析(Multi-Dimensional Scaling, MDS)是一类根据样本之间的相似性或距离关系来构造低维表示的方法。其目标不是直接对原始特征做线性投影,而是在低维空间中寻找一组坐标,使低维空间中的样本间距离尽可能逼近原始空间中的距离关系。
本项目中的 MDS-多维尺度 模块并不是调用 sklearn.manifold.MDS 的 SMACOF 迭代算法,而是实现了Classical MDS 路线:先计算成对距离矩阵,再对距离平方矩阵进行双中心化,最后对得到的 Gram 型矩阵做特征分解,从而得到低维嵌入。
当前模块的实际特征包括:
- 固定读取第 1 列为样本 ID,后续选中特征参与计算;
- 支持
euclidean和manhattan两种距离度量; - 支持可选
z-score标准化; - 通过双中心化与特征分解实现 classical MDS;
- 输出距离矩阵、特征值、残差方差、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.py、indicators_widget.py 与 data_validator.py 的实现,模块对输入数据的真实要求如下:
- 数据不能为空;
- 至少包含两列,即样本 ID 和至少一个特征列;
- 第 1 列样本 ID 必须唯一;
- 第 2 列及以后必须为数值型;
- 特征列不能含空值;
- 至少选择 1 个特征;
- 真正开始计算时还要求样本数至少为 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\) 表示按元素平方。代码中还会把 NaN 与 Inf 强制置为 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 维零向量嵌入。
项目导出的低维坐标列名为 Dim1、Dim2、…,对应 低维嵌入 工作表。
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,也没有暴露 dissimilarity、n_init、max_iter、normalized_stress 等 SMACOF 参数。它实现的是 classical MDS,因此:
- 直接从距离矩阵出发做特征分解;
- 不存在 SMACOF 的多次随机初始化;
Stress是项目后验计算出来的拟合指标,不是 SMACOF 的优化目标值。
5.2 实际输出维度可能小于请求维度
由于代码只保留正特征值对应方向,若正特征值数量少于用户请求的 n_components,则实际输出维度会自动变小,且 parameters["n_components"] 会记录修正后的维度。
6. 算法流程
结合当前项目代码,MDS-多维尺度 的实际执行流程如下:
- 读取
.xlsx、.xls或.csv文件;CSV 会依次尝试utf-8-sig、utf-8、gbk编码。 - 校验数据结构:首列样本 ID 唯一,其余列必须为无空值数值型特征。
- 在“特征选择”页从第 2 列开始勾选参与降维的特征。
- 在“方法设置”页设置
n_components、metric与是否标准化。 - 若勾选标准化,则按式(2) 对特征矩阵做
z-score变换。 - 按
euclidean或manhattan计算成对距离矩阵 \(D\)。 - 对 \(D\) 做双中心化,得到矩阵 \(B\)。
- 对 \(B\) 做特征分解,截取正特征值方向,得到低维嵌入坐标。
- 计算残差方差、Stress 和样本数等评价指标。
- 生成距离矩阵、特征值表、低维嵌入表和二维散点图。
- 导出 Excel 文件
MDS_results_<时间戳>.xlsx,并自动生成复现脚本。
7. 关键参数说明
7.1 n_components
目标降维维度,界面允许范围为 1 到 50,默认值为 2。需要注意:
- 这是“期望输出维度”;
- 若正特征值不足,最终实际维度会小于该值。
7.2 metric
当前支持:
euclideanmanhattan
该参数直接决定原始距离矩阵 \(D\) 的构造方式,因此会显著影响最终嵌入形状。
7.3 standardize
是否执行 z-score 标准化,默认勾选。若不同特征量纲差异明显,通常建议保持开启。
8. 输出结果与导出说明
8.1 Excel 工作表
根据 save_results() 的实现,导出的 Excel 文件包含:
原始数据处理后数据低维嵌入特征值评价指标距离矩阵参数设置图表清单
8.2 图表文件
若实际输出维度不少于 2,程序会在结果目录下生成:
MDS_plots_<时间戳>/embedding_2d.png
若实际输出维度只有 1,则不会生成二维散点图。
8.3 结果对象
当前代码返回的主要结果包括:
raw_data:原始输入数据(样本 ID + 选中特征);processed_data:标准化后的特征矩阵;final_results:低维嵌入坐标表;step_results.distance_matrix:全样本距离矩阵;step_results.eigenvalues:特征值表;step_results.metrics:残差方差、Stress、总样本数;parameters:维度、距离度量、标准化开关及均值方差等信息。
9. 论文写作建议
9.1 方法描述模板
“本文采用多维尺度分析(MDS)方法对样本进行降维表示。首先根据选定特征计算样本之间的距离矩阵,并在必要时对原始特征执行标准化处理;随后采用 classical MDS 路线,对距离平方矩阵进行双中心化并做特征分解,提取前若干个低维坐标作为样本嵌入表示。为评价嵌入质量,本文进一步计算残差方差与 Stress 指标,用于衡量低维距离对原始距离结构的保持程度。”
9.2 结果解释模板
结果部分可写为:若 ResidualVariance 和 Stress 都较小,通常说明 MDS 嵌入较好地保持了原始距离结构;若前几个特征值明显大于其余特征值,则说明主要空间结构集中在较少维度中。若二维嵌入图中样本形成明显分组或梯度分布,可进一步结合业务标签解释距离结构。
9.3 图表题注模板
- 图 1 MDS 二维嵌入散点图。
- 表 1 MDS 特征值结果。
- 表 2 MDS 嵌入质量评价指标。
10. 实现说明与注意事项
- 当前模块实现的是 classical MDS,而不是非度量 MDS 或 SMACOF 迭代版;论文中描述时不要混用。
- 若原始距离关系本身难以被低维欧氏空间表示,即使算法正确,
Stress也可能依然较高。 manhattan与euclidean可能对应完全不同的空间几何关系,实际分析中应结合问题背景选用。- 当特征量纲差异明显时,不做标准化往往会让大尺度变量主导距离矩阵。
- 若正特征值数量不足,实际输出维度会变小,这属于当前实现的正常行为,不是程序异常。
11. 单篇终审补充
11.1 图题与表题对齐建议
当前 MDS 模块的真实工作簿包含:
原始数据处理后数据低维嵌入特征值评价指标距离矩阵参数设置图表清单
其中 距离矩阵 和 低维嵌入 是最适合在论文中形成“输入距离结构 + 输出嵌入结构”对应关系的两张核心表;参数设置 则建议放在附录或方法说明中引用。不要把 特征值 误写成 PCA 意义下的协方差特征值,它来自 MDS 双中心化矩阵的特征分解。
图文件保存在结果目录下的 MDS_plots_<时间戳>/ 子目录,当前实现真实图名为:
embedding_2d.png
但只有当实际输出维度不少于 2 时才会生成这张图。因此图题建议写成“MDS 二维嵌入散点图”;若本次运行实际只有 1 维输出,则正文不应继续保留这张图的占位描述。
11.2 终审说明
这篇文档最需要避免的误写,是把当前实现当成 SMACOF 迭代版 MDS。代码明确走的是 classical MDS 路线:先构造距离矩阵,再双中心化并做特征分解。因此结果解释应围绕 eigenvalues、ResidualVariance 和 Stress 展开,而不是写“迭代收敛过程”。
另外,当前 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.png。MDS_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的口径说明。