Python 求一组特征向量对应的特征值
我用Python解决了大部分任务,但不确定如何输入(甚至理解)剩余的信息。你不应该在给定某个特征值的情况下找到特征向量吗,因此它出现在下面的相反位置: 让对称3×3矩阵Python 求一组特征向量对应的特征值,python,matrix,eigenvalue,eigenvector,Python,Matrix,Eigenvalue,Eigenvector,我用Python解决了大部分任务,但不确定如何输入(甚至理解)剩余的信息。你不应该在给定某个特征值的情况下找到特征向量吗,因此它出现在下面的相反位置: 让对称3×3矩阵A为A=((1 2 1)、(2 5 0)、(1 0 5)) 如果A具有以下三个特征向量,则找到三个相应的特征值: v1=(-5)、(2)、(1))v2=((0),(-1),(2))v3=((1)、(2)、(1))考虑特征向量的定义。矩阵a表示的线性变换的特征向量v是一个向量,当线性变换应用于该向量时,该向量仅在幅度上而不是方向上发
A
为A
=((1 2 1)、(2 5 0)、(1 0 5))
如果A
具有以下三个特征向量,则找到三个相应的特征值:v1
=(-5)、(2)、(1))
v2
=((0),(-1),(2))
v3
=((1)、(2)、(1))
考虑特征向量的定义。矩阵a表示的线性变换的特征向量v是一个向量,当线性变换应用于该向量时,该向量仅在幅度上而不是方向上发生变化。特征向量大小的标量变化是其特征值。你有一个线性变换,你已经得到了它的特征向量-要找到特征值,你所需要做的就是将变换应用到特征向量,并确定每个特征向量的标度。给定一个矩阵arr
和一个向量vec
,如果vec
是arr
的特征向量,然后:
np.dot(arr, vec) == lambda_ * vec
因此,检查所有np.dot(arr,vec)/vec
的值(最终忽略作为潜在特征向量的零向量,并抑制潜在除以零的误差),将揭示特征值:
import numpy as np
def find_eigenvalue(arr, vec):
result = None
if not np.all(np.isclose(vec, 0.0)):
with np.errstate(divide='ignore', invalid='ignore'):
for x, y in zip(np.dot(arr, vec), vec):
if np.isclose(y, 0.0) and np.isclose(x, 0.0):
continue
if result is None:
result = x / y
elif not np.isclose(result, x / y):
result = None
break
return result
其工作原理与预期一致:
print(find_eigenvalue(arr, np.array([0, 0, 0])))
# None
print(find_eigenvalue(arr, np.array([1, 0, 0])))
# None
print(find_eigenvalue(arr, np.array([0, 1, 0])))
# None
print(find_eigenvalue(arr, np.array([0, 0, 1])))
# None
print(find_eigenvalue(arr, np.array([0, -1, 2])))
# 5
print(find_eigenvalue(arr, np.array([-5, 2, 1])))
# -0.0
print(find_eigenvalue(arr, np.array([1, 2, 1])))
# 6.0
最后,请注意,
np.linalg.svd()
还将计算所有这些:
u, s, vh = np.linalg.svd(arr)
而
s
将包含特征值,u
和vh
将包含特征向量(更准确地说,u
中的左奇异特征向量和vh
中的右奇异特征向量的厄米特值)。这听起来像是一个数学问题,而不是一个编程问题。为什么您甚至需要编写代码来解决这个问题?每个特征向量有一个特征值,但每个特征值可以有多个特征向量(甚至是归一化的)。找到一个特征向量的特征值是一个计算矩阵与该向量乘积(部分)的问题。