在Julia的MultivariateStats.jl中区分MDS与PCA及报错排查
在MultivariateStats.jl中使用Metric MDS时遇到MethodError的解决方法
问题背景
在MultivariateStats.jl中同时使用PCA和MDS,代码如下:
M = fit(PCA, matrix; maxoutdim=2) Yte = predict(M, matrix) M1 = fit(MDS, matrix; maxoutdim=2, distances=false) Yte1 = predict(M1)
发现当MDS采用欧氏范数时,Yte与Yte1结果一致,此场景下MDS与PCA等价。随后尝试调用带自定义metric的MDS:
mds = fit(MDS, matrix; distances=true, metric=isotonic)
出现如下错误:
MethodError: no method matching fit(::Type{MDS}, ::Adjoint{Float64, Matrix{Float64}}; distances=true, metric=MultivariateStats.isotonic)
Closest candidates are:
fit(::Type{MDS}, ::AbstractMatrix{T}; maxoutdim, distances) where T<:Real at ~/.julia/packages/MultivariateStats/cFZlL/src/cmds.jl:232 got unsupported keyword argument "metric"
解决方法
问题出在调用类型的选择上:MDS类型默认对应经典多维缩放(Classical MDS),不支持metric参数;而带自定义度量的是Metric MDS,需要使用MetricMDS类型来调用。
正确的调用代码如下:
mds = fit(MetricMDS, matrix; distances=true, metric=isotonic)
额外注意事项:
- 确保MultivariateStats.jl为最新版本,
MetricMDS是较新版本引入的功能,旧版本可能不支持。 - 如果输入的
matrix是Adjoint类型(比如转置后的矩阵),可以先转换为普通矩阵:matrix = Matrix(matrix),避免类型匹配问题。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

