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

自定义PCA处理鸢尾花数据集y轴反转,与sklearn结果不符求排查

自定义PCA与sklearn PCA结果轴反转的问题分析

问题根源

你代码里的np.linalg.eigh函数返回的特征向量符号是不固定的。协方差矩阵属于对称矩阵,eigh是专门优化这类矩阵特征值分解的函数,但根据线性代数的基本性质:如果v是某个特征值对应的特征向量,那么-v也同样是该特征值的特征向量(满足$A(-v) = \lambda(-v)$)。而sklearn的PCA实现中,特征向量的符号选择逻辑和eigh不同,尤其是次要主成分(比如第二维),这就导致投影后的结果在对应轴上出现反转。

验证方式

你可以直接对比两者的特征向量:

  • 打印sklearn PCA的components_属性
  • 打印你自定义PCA中的eigenvector_subset
    会发现对应的主成分向量是互为相反数的关系,比如sklearn的第二主成分是[-0.1736, 0.9239, -0.3800, -0.0416],而你的实现中是[0.1736, -0.9239, 0.3800, 0.0416],投影后自然会出现轴方向反转。

修正方案

PCA的核心是保留数据的方差结构,轴的方向本身不影响方差解释能力,所以如果只是可视化需求,直接对反转的轴取反即可:

# 对自定义PCA输出的第二维(y轴)取反
X_reduced[:, 1] = -X_reduced[:, 1]

或者在选择特征向量时调整符号:

# 反转第二主成分特征向量的符号
eigenvector_subset[:, 1] = -eigenvector_subset[:, 1]

如果想从根源对齐,也可以改用np.linalg.eig处理协方差矩阵,但eig对对称矩阵的效率不如eigh,且同样可能存在符号不确定性,所以按需调整符号是最直接的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:10:36