numpy - 为什么特征向量与对应特征值的乘积不等于原矩阵与特征向量的乘积?
问题描述
当我将一个特征向量乘以一个矩阵时,它应该得到与将该特征向量乘以其对应的特征值相同的输出。我正在尝试验证我的特征向量和特征值是否像宣传的那样工作,但输出似乎不正确。
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.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。
推荐阅读
- spring-batch - 如何将 Spring Cloud Task 与模块化 Spring Batch 作业一起使用?
- java - Java 8 中的 Long.decode 为有效数字抛出 NumberFormatException
- javascript - 在 Elasticsearch 中,是否可以对索引进行临时 POST?
- monodevelop - 如何检查是否选择了单选按钮 Monodevelop
- maven - 是否可以从项目的依赖项中强制将 Maven 插件包含在项目中?
- sql - 用于实验室值的 SAS 宏
- arrays - 如何从数组创建熊猫数据框([[[135, 2270.24]]],dtype=object)
- android - 为什么我不能使用意图转换回我的 Android 应用程序中的前一个片段?
- android - 使用 Web 服务获取服务器数据
- xcode - 我需要将哪些文件链接到我的 xcode 项目(内置游戏制作器)才能使其工作?