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

如何避免MSD算法将3D数据降维至2D时的镜像输出问题?

解决MDS降维时的镜像翻转问题

MDS(多维尺度分析)的核心目标是保留数据点间的两两距离,而旋转、镜像反射后的点集完全满足距离不变的要求,这就是你遇到镜像问题的根本原因——算法的解本身具有旋转/反射歧义,默认初始化可能得到翻转后的结果。

要自动对齐到原始数据的x-y视角,不需要手动翻转,用Procrustes分析就能实现降维结果与原始数据的朝向匹配,具体实现如下:

实现步骤

  1. 先获取原始数据的参考朝向(比如用PCA提取前两个主成分,或直接用原始数据的X、Y维度);
  2. 通过Procrustes变换将MDS降维后的点集对齐到参考方向,消除反射和旋转差异。

修改后的代码

import numpy as np
from sklearn.manifold import MDS
from sklearn.decomposition import PCA
from sklearn.utils.extmath import procrustes

# 提取3D数据
points = df[['X', 'Y', 'Z']].values

# 计算两两距离并执行MDS
distances = np.sqrt(np.sum((points[:, None, :] - points[None, :, :]) ** 2, axis=-1))
mds = MDS(n_components=2, dissimilarity='precomputed', n_init=70, max_iter=200, eps=1e-5, random_state=0)
transformed_points = mds.fit_transform(distances)

# 方案1:用PCA获取原始数据的主成分方向作为参考
pca = PCA(n_components=2)
pca_reference = pca.fit_transform(points)

# 方案2:直接用原始数据的X、Y维度作为参考(如果原始x-y视角就是你要保留的)
# pca_reference = points[:, :2]

# 执行Procrustes对齐,消除镜像/旋转歧义
_, aligned_points, _ = procrustes(pca_reference, transformed_points)

# aligned_points 就是朝向与原始数据匹配的降维结果

原理说明

Procrustes变换会找到最优的旋转、反射参数,让降维后的点集尽可能贴合参考点集,自动修正镜像翻转的问题,同时不会破坏MDS保留的距离关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:15:58