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

Numpy 为什么特征向量和相应特征值的乘积不等于原始矩阵和特征向量的乘积?,numpy,linear-algebra,matrix-multiplication,eigenvalue,eigenvector,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时,它们是相同的

当我将一个特征向量乘以一个矩阵时,它的输出应该与将该特征向量乘以其相应的特征值的结果相同。我试图验证我的特征向量和特征值是否如广告中所宣传的那样工作,但输出似乎不正确

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
请记住,返回复厄米(共轭对称)或实对称矩阵的特征值和特征向量。对于厄米矩阵:

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\u矩阵
是否与类似
np.allclose(cov\u矩阵,cov\u矩阵.T.conj())的东西对称
。如果没有,您可以直接使用。

列eig_vecs[:,i]是对应于特征值eig_vals[i]的特征向量,而不是行eig_vecs[i]谢谢!我编辑了代码(可能不正确,但不确定)以纠正这一点,但a和b仍然返回不同的向量。注意
np.linalg.eigh
仅适用于“复厄米(共轭对称)矩阵或实对称矩阵”(取自文档)。你确定你的矩阵是对称的吗?如果是这样的话,请提供具体的例子说明
scaled\u数据
cov\u矩阵
确实是对称的,我同意你的建议,使用
np.allclose(cov\u矩阵,cov\u矩阵.T)
。另外,当用
A=cov_矩阵
替换
A=np.random.random((10,10))
时,代码返回true。我认为我检查值的方式有问题。我在做
print(a[0])
print(b[0])
print(a[0]==b[0])
,以为值是相同的,但这一定是被误导了。好吧,我解决了问题,这实际上与作为特征向量的列的初始注释有关。我使用eig_vecs=eig_vecs[::-1]来翻转列表顺序,这会混淆所有特征向量
np.allclose
然后让我感到困惑,因为在某些情况下仍然返回true,但这只是用于可忽略的特征值,所以向量看起来足够接近。非常感谢你的帮助,我会多看几个小时的。