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

4

当我把一个特征向量与矩阵相乘时,它应该得到与该特征向量与对应特征值相乘相同的结果。我正在尝试验证我的特征向量和特征值是否按照预期工作,但输出似乎不正确。

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时,它们的形状相同,但值全部不同。这里出了什么问题?

3
列 eig_vecs[:, i] 是对应于特征值 eig_vals[i] 的特征向量,而不是行 eig_vecs[i]。 - Yacola
谢谢!我编辑了代码(可能不正确,但不确定)来纠正这个问题,但是a和b仍然返回不同的向量。 - cmgodwin
请注意,np.linalg.eigh 仅适用于“复合 Hermitian(共轭对称)或实对称矩阵”(摘自文档)。您确定您的矩阵是对称的吗?如果是,请提供关于 scaled_data 的具体示例。 - Roim
1个回答

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 返回一个复合埃尔米特(共轭对称)或实对称矩阵的特征值和特征向量。因此,对于一个埃尔米特矩阵:
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


cov_matrix确实是对称的,我使用了您建议的np.allclose(cov_matrix, cov_matrix.T)进行了检查。此外,当将A = np.random.random((10,10))替换为A=cov_matrix时,您的代码返回了true。我认为我检查值的方式有问题。 - cmgodwin
我在执行 print(a[0])print(b[0])print(a[0] == b[0]),本以为这些值会是相同的,但显然我的想法有误。 - cmgodwin
好的,我找到了问题所在,实际上与您最初评论中的列是特征向量有关。我使用 eig_vecs = eig_vecs [:: -1] 来翻转列表顺序,这会混淆所有特征向量。然后 np.allclose 在某些情况下仍返回 true,但这只是由于微不足道的特征值,因此向量看起来足够接近。非常感谢您的帮助,否则我还要盯着这个问题几个小时。 - cmgodwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接