Julia中MetricMDS设置metric=isotonic不收敛及MDS类型确认
Julia中MetricMDS的
metric=isotonic参数与非度量MDS的疑问解答 1. metric=isotonic的作用与收敛失败原因
当你在fit(MetricMDS, ...)中设置metric=isotonic时,确实是在执行非度量MDS:
- 这个参数会触发算法把输入的相异度矩阵
D转换为保序的有序差异值——只保留原始距离的相对大小顺序,不再严格维持距离的具体数值。 - 非度量MDS依赖迭代优化算法(如SMACOF)拟合模型,这类算法对数据分布、初始迭代值敏感度较高,容易出现迭代次数耗尽仍未达到收敛阈值的情况,也就是你遇到的错误:
failure to converge after 300 iterations. Last change (0.1382513330677284) was greater than tolerance (0.001)
2. 第二段代码的MDS类型判断
去掉metric=isotonic后的代码:
D = pairwise(Euclidean(), mat_new) M = fit(MetricMDS, D; distances=true, maxoutdim=2) Yte = predict(M)
执行的是度量MDS(Metric MDS):
- 默认情况下,
MetricMDS会使用identity作为metric参数,直接基于原始相异度矩阵的数值关系拟合,不需要做有序转换。 - 度量MDS的拟合过程基于经典多维缩放的解析解法,无需迭代优化,因此运行更稳定,不会出现收敛问题。
3. 非度量MDS收敛问题的解决建议
如果需要使用metric=isotonic完成非度量MDS,可以尝试以下调整:
- 增加迭代次数:通过
maxiter参数设置更大的值,比如maxiter=1000 - 放宽收敛阈值:通过
tol参数调整,比如tol=0.01 - 预处理输入数据:检查
mat_new是否存在异常值、极端距离,或对数据做标准化/归一化处理
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

