为何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会出现反转?


复现代码
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
相关产品推荐
相关产品推荐

