如何计算numpy特征值和特征向量

iga*_*iil 3 python numpy

我使用numpy来计算对称方阵的特征值和特征向量.我的阵列是:

L = [[ 2. -1. -1.  0.  0.  0.]
     [-1.  3.  0. -1.  0. -1.]
     [-1.  0.  2. -1.  0.  0.]
     [ 0. -1. -1.  3. -1.  0.]
     [ 0.  0.  0. -1.  2. -1.]
     [ 0. -1.  0.  0. -1.  2.]]
Run Code Online (Sandbox Code Playgroud)

执行时的结果numpy.linalg.eig(L)如下所示

特征值:

[ 5.00000000e+00,   
  3.96872205e-16,   
  1.00000000e+00,
  2.00000000e+00,   
  3.00000000e+00,   
  3.00000000e+00 ]
Run Code Online (Sandbox Code Playgroud)

特征向量:

[[ -2.88675135e-01   4.08248290e-01  -5.00000000e-01  4.08248290e-01   -4.36632863e-01   4.44614891e-01]
 [  5.77350269e-01   4.08248290e-01  -3.34129212e-16  4.08248290e-01   -1.08813217e-01  -5.41271705e-01]
 [  2.88675135e-01   4.08248290e-01  -5.00000000e-01  4.08248290e-01    5.45446080e-01   9.66568140e-02]
 [ -5.77350269e-01   4.08248290e-01   1.06732810e-16  4.08248290e-01   -1.08813217e-01  -5.41271705e-01]
 [  2.88675135e-01   4.08248290e-01   5.00000000e-01  4.08248290e-01   -4.36632863e-01   4.44614891e-01]
 [ -2.88675135e-01   4.08248290e-01   5.00000000e-01 -4.08248290e-01    5.45446080e-01   9.66568140e-02]]
Run Code Online (Sandbox Code Playgroud)

结果与您在分析计算它们时得到的结果非常接近(如果已标准化),但某些误差似乎在特征值和特征向量中都会引入.有没有办法绕过这些错误使用numpy?

这些错误来自哪里?numpy使用什么算法?

Jon*_*ice 8

如果您想要分析推导的精度,则需要使用符号计算,这是Wolfram Alpha,Mathematica和相关系统使用的.例如,在Python中,您可能需要查看SymPy.

嵌入到您正在使用的NumPy包中的数值计算固有地受到浮点数值表示的小错误和变化的影响.这种误差和近似值在数值计算中是不可避免的.

这是一个例子:

from sympy import Matrix, pretty

L = Matrix([[ 2, -1, -1,  0,  0,  0,],
     [-1,  3,  0, -1,  0, -1,],
     [-1,  0,  2, -1,  0,  0,],
     [ 0, -1, -1,  3, -1,  0,],
     [ 0,  0,  0, -1,  2, -1,],
     [ 0, -1,  0,  0, -1,  2,]])

print "eigenvalues:"
print pretty(L.eigenvals())
print
print "eigenvectors:"
print pretty(L.eigenvects(), num_columns=132)
Run Code Online (Sandbox Code Playgroud)

产量:

eigenvalues:
{0: 1, 1: 1, 2: 1, 3: 2, 5: 1}

eigenvectors:
??0, 1, ??1???, ?1, 1, ??-1???, ?2, 1, ??1 ???, ?3, 2, ??1 ?, ?0 ???, ?5, 1, ??1 ????
??      ?? ???  ?      ??  ???  ?      ??  ???  ?      ??  ?  ?  ???  ?      ??  ????
??      ??1???  ?      ??0 ???  ?      ??1 ???  ?      ??-1?  ?-1???  ?      ??-2????
??      ?? ???  ?      ??  ???  ?      ??  ???  ?      ??  ?  ?  ???  ?      ??  ????
??      ??1???  ?      ??-1???  ?      ??-1???  ?      ??0 ?  ?1 ???  ?      ??-1????
??      ?? ???  ?      ??  ???  ?      ??  ???  ?      ??  ?  ?  ???  ?      ??  ????
??      ??1???  ?      ??0 ???  ?      ??-1???  ?      ??-1?  ?-1???  ?      ??2 ????
??      ?? ???  ?      ??  ???  ?      ??  ???  ?      ??  ?  ?  ???  ?      ??  ????
??      ??1???  ?      ??1 ???  ?      ??-1???  ?      ??1 ?  ?0 ???  ?      ??-1????
??      ?? ???  ?      ??  ???  ?      ??  ???  ?      ??  ?  ?  ???  ?      ??  ????
??      ??1???  ?      ??1 ???  ?      ??1 ???  ?      ??0 ?  ?1 ???  ?      ??1 ????
Run Code Online (Sandbox Code Playgroud)

虽然ASCII漂亮的打印机,嗯,努力提供甚至准好看的输出,你可以看到你正在获得符号计算,精确的输出.如果您正在使用IPython并将其设置为显示LaTeX输出,那么您将获得更好的显示效果.


Jua*_*uan 5

看起来它正在使用 LAPACK 的迭代方法。它收敛到一个解。如果不收敛,则抛出异常。

既然你知道矩阵是对称的,你可能会用 eigh 做得更好。 http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html

文档页面:http : //docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html

源代码:https : //github.com/numpy/numpy/blob/v1.9.1/numpy/linalg/linalg.py#L982