寻找一组特征向量的对应特征值
Finding corresponding eigenvalues to a set of 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 是一个向量,当该线性变换应用于它。特征向量大小的标量变化是它的特征值。你有一个线性变换,你已经得到了它的特征向量 - 要找到特征值,你需要做的就是将变换应用于特征向量并确定每个特征向量被缩放的标量。
给定一个矩阵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
).
中的右奇异特征向量
我使用 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
).