自定义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
相关产品推荐
相关产品推荐

