numpy中的特征向量归一化

numpy中的特征向量归一化,numpy,eigenvalue,eigenvector,Numpy,Eigenvalue,Eigenvector,我用numpy中的linalg来计算有符号实矩阵的特征值和特征向量。 我已经读过了,但仍然没有掌握特征向量的标准化。 下面是一个直接的例子 特征值为1和3。 对于特征向量,我们期望[1,-1]和[1,1]的标量倍数,我得到: eig_vals= [ 3. 1.] eig_vets= [[ 0.70710678 -0.70710678] [ 0.70710678 0.70710678]] 我知道1/sqrt(2)因子的范数为1,但为什么? 正常化可以“

我用numpy中的linalg来计算有符号实矩阵的特征值和特征向量。 我已经读过了,但仍然没有掌握特征向量的标准化。 下面是一个直接的例子

特征值为1和3。 对于特征向量,我们期望[1,-1]和[1,1]的标量倍数,我得到:

    eig_vals=
    [ 3.  1.]
    eig_vets=
    [[ 0.70710678 -0.70710678]
    [ 0.70710678  0.70710678]]
我知道1/sqrt(2)因子的范数为1,但为什么? 正常化可以“关闭”吗?
谢谢

维基百科文章中第一个特征向量的关键信息是

v1=1的任何非零向量−v2解这个方程

因此,实际的解决方案是
V1=[x,-x]
。拾取向量V1=[1,-1]可能会让人赏心悦目,但它的算术性与拾取向量V1=[104051,-104051]或任何其他实际值一样

实际上,挑选
V1=[1,-1]/sqrt(2)
是最不随意的。在所有可能的
V1
向量中,它是唯一具有单位长度的向量

但是,如果希望第一个值为
1
,而不是单位长度,则可以这样做

eigh_vects /= eigh_vects[:, 0]

如果
sympy
是您的一个选项,那么它的正常化似乎不那么积极:

import sympy
a = sympy.Matrix([[2, 1], [1, 2]])
a.eigenvects()
# [(1, 1, [Matrix([
# [-1],
# [ 1]])]), (3, 1, [Matrix([
# [1],
# [1]])])]
v_vec是一个包含2个元组的列表:

[(1, 1, [Matrix([
   [-1],
   [ 1]])]), (3, 1, [Matrix([
   [1],
   [1]])])]
1和3是两个特征值。1和3后面的“1”是特征值的数目。在每个元组中,第三个元素是每个特征值的特征向量。它是sp中的矩阵对象。您可以将矩阵对象转换为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.]]

如果将其关闭,结果会是什么?否则,
eig_vets.dot(eig_vals).dot(eig_vets.conj().T)
将无法给出正确答案。
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.]]