【问题标题】:Why does the product of the eigenvector and the corresponding eigenvalue not equal the product of the original matrix and the eigenvector?为什么特征向量与对应特征值的乘积不等于原矩阵与特征向量的乘积?
【发布时间】:2020-11-08 07:14:30
【问题描述】:

当我将一个特征向量乘以一个矩阵时,它应该得到与将该特征向量乘以其对应的特征值相同的输出。我正在尝试验证我的特征向量和特征值是否像宣传的那样工作,但输出似乎不正确。

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

【问题讨论】:

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

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


【解决方案1】:

尝试以下方法:

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

【讨论】:

  • cov_matrix 确实是对称的,我检查了您使用np.allclose(cov_matrix, cov_matrix.T) 的建议。此外,当用A=cov_matrix 替换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,但这只是因为特征值可以忽略不计,所以向量看起来足够接近。非常感谢您的帮助,我会盯着这个看几个小时的。
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2012-08-08
  • 2012-08-10
  • 2018-10-31
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多