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

为何np.linalg.eig得到的PC1与eigh结果相反,PC2却一致?

问题:np.linalg.eig与np.linalg.eigh计算PCA时主成分反转的原因

我正在对比np.linalg.eig与np.linalg.eigh的PCA计算结果,希望厘清为何二者输出的主成分存在部分反转情况:f1、f2为两个特征,pc1、pc2是用eig得到的主成分,pc1h、pc2h是用eigh得到的主成分。可见pc2与pc2h形态相近,但pc1与pc1h呈反转状态,且pc1h形态与f2相符,符合预期。请问为何pc1会出现反转?

特征与主成分对比图1
特征与主成分对比图2

复现代码

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

#Generate a dummy dataset.
np.random.seed(300)
X = np.random.randint(10,50,100).reshape(50,2)
X[:,1] =X[:,1]*10
def PCA(X, num_components):
    # Step-1
    X_meaned = X - np.mean(X, axis=0)

    # Step-2
    cov_mat = np.cov(X_meaned, rowvar=False)

    # Step-3
    eigen_values, eigen_vectors = np.linalg.eig(cov_mat)

    # Step-4
    sorted_index = np.argsort(eigen_values)[::-1]
    sorted_eigenvalue = eigen_values[sorted_index]
    sorted_eigenvectors = eigen_vectors[:, sorted_index]

    # Step-5
    eigenvector_subset = sorted_eigenvectors[:, 0:num_components]

    # Step-6
    X_reduced = np.dot(eigenvector_subset.transpose(), X_meaned.transpose()).transpose()

    return X_reduced

def PCAh(X, num_components):
    # Step-1
    X_meaned = X - np.mean(X, axis=0)

    # Step-2
    cov_mat = np.cov(X_meaned, rowvar=False)

    # Step-3
    eigen_values, eigen_vectors = np.linalg.eigh(cov_mat)

    # Step-4
    sorted_index = np.argsort(eigen_values)[::-1]
    sorted_eigenvalue = eigen_values[sorted_index]
    sorted_eigenvectors = eigen_vectors[:, sorted_index]

    # Step-5
    eigenvector_subset = sorted_eigenvectors[:, 0:num_components]

    # Step-6
    X_reduced = np.dot(eigenvector_subset.transpose(), X_meaned.transpose()).transpose()

    return X_reduced

X_reduced = PCA(X,2)
X_reducedh = PCAh(X,2)

df_y = pd.DataFrame()
df_y['f1'] = X[:,0]
df_y['f2'] = X[:,1]
df_y['pc1'] = X_reduced[:,0]
df_y['pc2'] = X_reduced[:,1]
df_y['pc1h'] = X_reducedh[:,0]
df_y['pc2h'] = X_reducedh[:,1]
df_y.plot()
plt.show(block=True)

原因解释

  • 特征向量的符号本质不唯一:对于特征值方程 (A\mathbf{v} = \lambda\mathbf{v}),如果(\mathbf{v})是对应特征值(\lambda)的特征向量,那么(-\mathbf{v})同样满足方程,属于同一个特征值的有效特征向量。
  • 两个函数的实现逻辑差异:
    • np.linalg.eigh是专门为对称矩阵(协方差矩阵天生对称)设计的求解函数,输出的特征向量会遵循特定的符号规则(比如保证向量第一个元素为正,或者符合内部排序约定);
    • np.linalg.eig是通用特征值求解工具,处理对称矩阵时没有强制的符号约束,输出的特征向量符号可能与eigh完全相反。
  • PCA中符号反转不影响效果:主成分的核心是捕捉数据的最大方差方向,正负方向只是观测角度不同,包含的方差解释能力完全一致。你看到的pc1反转,只是eig输出的对应最大特征值的特征向量与eigh符号相反,投影后自然呈现反转状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:54