【问题标题】:Eigenvector normalization in numpynumpy中的特征向量归一化
【发布时间】:2017-12-13 21:53:04
【问题描述】:

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

【问题讨论】:

  • 关掉会有什么结果?否则eig_vets.dot(eig_vals).dot(eig_vets.conj().T) 不会给你正确的答案。

标签: numpy eigenvalue eigenvector


【解决方案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 & 3 后面的“1”是特征值的个数。在每个元组中,第三个元素是每个特征值的特征向量。它是 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.]]

【讨论】:

    【解决方案2】:

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

    任何具有 v1 = -v2 的非零向量都可以求解这个方程。

    所以实际的解决方案是V1 = [x, -x]。选择矢量V1 = [1, -1] 可能会让人赏心悦目,但它与选择矢量V1 = [104051, -104051] 或任何其他实际值一样随意。

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

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

    eigh_vects /= eigh_vects[:, 0]
    

    【讨论】:

      【解决方案3】:

      如果您可以选择sympy,则它的标准化似乎不太积极:

      import sympy
      a = sympy.Matrix([[2, 1], [1, 2]])
      a.eigenvects()
      # [(1, 1, [Matrix([
      # [-1],
      # [ 1]])]), (3, 1, [Matrix([
      # [1],
      # [1]])])]
      

      【讨论】:

        猜你喜欢
        • 2019-01-24
        • 2013-02-20
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        相关资源
        最近更新 更多