为什么特征向量和相应特征值的乘积不等于原始矩阵和特征向量的乘积?

时间:2020-07-18 17:30:34

标签: numpy linear-algebra matrix-multiplication eigenvalue eigenvector

当我将特征向量与矩阵相乘时,其结果应与将特征向量与其对应的特征值相乘得到相同的输出。我试图验证我的特征向量和特征值是否如广告所示正常工作,但输出似乎不正确。

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时,它们的形状相同,但是它们的值都不同。怎么了?

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

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.linalg.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.linalg.eig