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

sklearn.manifold.MDS预计算相异矩阵定位逻辑及扩展方法问询

关于sklearn MDS的理解与替代方案

你的理解完全正确

sklearn的manifold.MDS底层采用SMACOF算法,不管设置dissimilarity='euclidean'还是'precomputed',核心逻辑都是:

  • 用euclidean时,先从原始样本计算欧氏距离作为差异值(disparities)
  • 用precomputed时,直接将你传入的自定义相异矩阵作为差异值
  • 随后算法会在低维嵌入空间中调整点的位置,最小化「嵌入空间中点对的欧氏距离」与「预设差异值」之间的偏差(即stress值)

简言之,sklearn的MDS本质是用欧氏空间的嵌入结果去拟合你输入的差异值,哪怕你传入的是非欧氏相异矩阵,它也只会在欧氏空间里寻找最优嵌入。

如何实现非欧氏距离的MDS拟合/可视化

sklearn的MDS本身不支持替换嵌入空间的距离度量,因为SMACOF的实现硬编码了欧氏距离的计算逻辑。你有两个可行方向:

1. 修改sklearn源码

找到sklearn/manifold/_mds.py中计算嵌入点对距离的代码段(比如_smacof_single函数里的距离计算部分),把欧氏距离替换成你需要的度量(比如曼哈顿距离、余弦距离等)。修改后重新运行算法,就能让嵌入空间使用和你相异矩阵一致的距离度量来最小化stress。

2. 更换工具或手动实现

  • 使用第三方库:比如pyMDS这类支持自定义距离度量的MDS实现,它允许你指定嵌入空间中用来拟合的距离函数,直接匹配你预计算相异矩阵时用的度量。
  • 手动实现优化逻辑:用scipy.optimize.minimize这类优化器,自定义应力函数——输入嵌入坐标,计算嵌入空间中自定义距离与输入相异矩阵的偏差,然后通过优化器找到能最小化该偏差的坐标。得到坐标后,用matplotlib/seaborn等工具做可视化即可,和普通MDS的可视化流程完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:15