numpy中的特征向量归一化

时间:2017-12-13 21:53:04

标签: numpy eigenvalue eigenvector

我正在使用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,但为什么? 标准化可以“关闭”吗? 谢谢!

3 个答案:

答案 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]])])]