Python 求一组特征向量对应的特征值

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是一个向量,当线性变换应用于该向量时,该向量仅在幅度上而不是方向上发

我用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是一个向量,当线性变换应用于该向量时,该向量仅在幅度上而不是方向上发生变化。特征向量大小的标量变化是其特征值。你有一个线性变换,你已经得到了它的特征向量-要找到特征值,你所需要做的就是将变换应用到特征向量,并确定每个特征向量的标度。

给定一个矩阵
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
中的右奇异特征向量的厄米特值)。

这听起来像是一个数学问题,而不是一个编程问题。为什么您甚至需要编写代码来解决这个问题?每个特征向量有一个特征值,但每个特征值可以有多个特征向量(甚至是归一化的)。找到一个特征向量的特征值是一个计算矩阵与该向量乘积(部分)的问题。