当我将特征向量乘以矩阵时,它应该会产生与将该特征向量乘以其相应特征值相同的输出。我试图验证我的特征向量和特征值是否像广告中所说的那样工作,但输出似乎不正确。
cov_matrix = np.cov(scaled_data)
eig_vals, eig_vecs = np.linalg.eigh(cov_matrix)
a = cov_matrix.dot(eig_vecs[:, 0])
b = eig_vecs[:, 0] * eig_vals[0]
当我打印a和b时,它们是相同的形状,但它们的值都不同。这里出了什么问题?
尝试以下操作:
import numpy as np
np.random.seed(42) # for reproducibility
A = np.random.random((10,10)) + np.random.random((10,10)) * 1j
eig_vals, eig_vecs = np.linalg.eigh(A)
np.allclose(A @ eig_vecs[:, 0], eig_vals[0] * eig_vecs[:, 0])
>>> False
请记住,np.linal.eigh返回复埃尔米特(共轭对称(或实对称矩阵的特征值和特征向量。对于hermitian矩阵:
A = (A + A.T.conj())/2 # Here A is forced Hermitian now
eig_vals, eig_vecs = np.linalg.eigh(A)
print(np.allclose(A @ eig_vecs[:, 0], eig_vals[0] * eig_vecs[:, 0]))
>>> True
在对角化之前检查cov_matrix
是否与类似np.allclose(cov_matrix, cov_matrix.T.conj())
的东西对称。如果没有,您可以直接使用np.linal.eig.