You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何降低多维缩放(MDS)分析的应力值并提升3维投影拟合效果

问题解答

1 先做100维MDS再PCA降3维的方案是否可行

不可行。
MDS的应力值仅对应当前输出维度下的距离拟合效果,100维MDS应力低是因为高维空间足够容纳原始距离的结构信息。后续用PCA降维到3维的过程,会直接丢失97个维度的结构信息,最终得到的3维坐标的距离拟合效果和直接训练3维MDS没有本质差异,甚至会因为多了一步变换引入额外误差,完全达不到降低3维空间应力的目的。

2 提升3维空间拟合效果的可行方法

  • 首先校准应力计算逻辑
    sklearn内置的MDS.stress_返回的是原始应力,计算公式为所有配对原始距离和拟合距离差值的平方和,并非行业通用的归一化stress-1值。你需要手动计算归一化值再判断拟合效果,避免误判:
import numpy as np
import pandas as pd
from sklearn.manifold import MDS

# 你的原有数据读取逻辑
df = pd.read_excel('./FTM_fingerprint_FULL_dissimilarity_matrix_MORGAN_1024_2.xlsx', index_col = 0, header = 0)
mds1 = MDS(random_state = 1, dissimilarity = 'precomputed', n_init=16, n_components=3, eps=1e-9)
X_transform = mds1.fit_transform(df)

# 计算正确的归一化stress-1
original_dist = df.values[np.triu_indices_from(df.values, k=1)]
norm_stress = np.sqrt(mds1.stress_ / np.sum(original_dist **2))
print("归一化stress-1值:", norm_stress)

很多用户误将原始应力当做归一化值,实际拟合效果并没有看起来那么差。

  • 切换为非度量MDS
    如果你的可视化场景更关注样本的相对远近关系,而非绝对距离的数值精度,可以使用非度量MDS,仅保留距离的序关系,应力会大幅降低:
mds_nonmetric = MDS(
    random_state = 1, 
    dissimilarity = 'precomputed', 
    n_init = 32, 
    n_components = 3, 
    max_iter = 1000, # 增大迭代次数保证收敛
    metric = False # 开启非度量模式
)
X_transform = mds_nonmetric.fit_transform(df)
  • 换用可视化专用降维算法
    针对3维可视化场景,更推荐使用UMAP或t-SNE,二者都支持预计算距离矩阵输入,对高维局部结构的保留效果远好于MDS,可视化表现更优,以UMAP为例:
import umap
umap_3d = umap.UMAP(
    n_components = 3,
    metric = 'precomputed',
    random_state = 1,
    n_neighbors = 15, # 可根据样本量调整
    min_dist = 0.1
)
X_transform = umap_3d.fit_transform(df)
  • 调整训练参数
    增大n_init到32以上、max_iter到2000,避免MDS陷入局部最优,同时可以适当调大eps到1e-7,降低收敛阈值,避免无意义的精度消耗。

3 工具更换建议

不需要立刻更换技术栈,sklearn的MDS实现足以满足常规需求。如果上述调整后效果仍不符合预期,可以尝试Python的smacof包(专门优化MDS算法),或者R语言的MASS::isoMDS函数,实现更成熟的MDS训练逻辑。

内容的提问来源于stack exchange,提问作者prfsullivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:06