我正在使用ninaly中的linalg来计算有符号实数矩阵的特征值和特征向量。 我读过this previous question但仍然没有掌握特征向量的归一化。 以下是Wikipedia:
的示例 import numpy as np
from numpy import linalg as la
a = np.matrix([[2, 1], [1, 2]], dtype=np.float)
eigh_vals, eigh_vects = np.linalg.eig(a)
print 'eigen_values='
print eigh_vals
print 'eigen_vectors='
print eigh_vects
特征值为1和3。 对于特征向量,我们期望标量倍数为[1,-1]和[1,1],我得到:
eig_vals=
[ 3. 1.]
eig_vets=
[[ 0.70710678 -0.70710678]
[ 0.70710678 0.70710678]]
我理解1 / sqrt(2)因子是norm = 1,但为什么? 标准化可以“关闭”吗? 谢谢!
答案 0 :(得分:1)
import numpy as np
import sympy as sp
v = sp.Matrix([[2, 1], [1, 2]])
v_vec = v.eigenvects()
v_vec是一个包含2个元组的列表:
[(1, 1, [Matrix([
[-1],
[ 1]])]), (3, 1, [Matrix([
[1],
[1]])])]
1和3是两个特征值。 ' 1'落后于1& 3是特征值的数量。在每个元组中,第三个元素是每个特征值的特征向量。它是sp中的Matrix对象。您可以将Matrix对象转换为np数组。
v_vec1 = np.array(v_vec[0][2], dtype=float)
v_vec2 = np.array(v_vec[1][2], dtype=float)
print('v_vec1 =', v_vec1)
print('v_vec2 =', v_vec2)
以下是您将获得的归一化特征向量:
v_vec1 = [[-1. 1.]]
v_vec2 = [[1. 1.]]
答案 1 :(得分:0)
维基百科文章中第一个特征向量的关键信息是
v1 = -v2的任何非零向量都能解决这个等式。
所以实际的解决方案是V1 = [x, -x]
。挑选矢量V1 = [1, -1]
可能会让人眼感到满意,但它与选择矢量V1 = [104051, -104051]
或任何其他真实价值一样具有支持性。
实际上,选择V1 = [1, -1] / sqrt(2)
是最不随意的。在V1
的所有可能向量中,它是唯一具有单位长度的向量。
但是,如果您希望第一个值为1
而不是单位长度,则可以执行
eigh_vects /= eigh_vects[:, 0]
答案 2 :(得分:0)
如果sympy
是您的选项,则可能会较不积极地规范化:
import sympy
a = sympy.Matrix([[2, 1], [1, 2]])
a.eigenvects()
# [(1, 1, [Matrix([
# [-1],
# [ 1]])]), (3, 1, [Matrix([
# [1],
# [1]])])]