如何避免MSD算法将3D数据降维至2D时的镜像输出问题?
解决MDS降维时的镜像翻转问题
MDS(多维尺度分析)的核心目标是保留数据点间的两两距离,而旋转、镜像反射后的点集完全满足距离不变的要求,这就是你遇到镜像问题的根本原因——算法的解本身具有旋转/反射歧义,默认初始化可能得到翻转后的结果。
要自动对齐到原始数据的x-y视角,不需要手动翻转,用Procrustes分析就能实现降维结果与原始数据的朝向匹配,具体实现如下:
实现步骤
- 先获取原始数据的参考朝向(比如用PCA提取前两个主成分,或直接用原始数据的X、Y维度);
- 通过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
相关产品推荐
相关产品推荐

