numPy中意外的特征向量

时间:2013-09-09 23:35:10

标签: python numpy linear-algebra eigenvector

我看过this问题,这与我尝试使用numPy计算Python中的主要特征向量有关。

我试图计算n x n矩阵的主要特征向量,而不必进入过多的重线性代数。我对行列式,特征值,特征向量和特征多项式进行了粗略的研究,但我更倾向于依靠numPy实现来寻找特征值,因为我认为它比我自己的效率更高。

我遇到的问题是我使用了这段代码:

    markov = array([[0.8,0.2],[.1,.9]])

    print eig(markov)

...作为测试,得到了这个输出:

    (array([ 0.7,  1. ]), array([[-0.89442719, -0.70710678],
           [ 0.4472136 , -0.70710678]]))

我对此感到担忧的是,根据Perron-Frobenius定理,第二个特征向量的所有分量都应该是正的(因为根据维基百科,“具有正条目的实矩阵具有唯一的最大实特征值,并且相应的特征向量具有严格的正分量“)。

任何人都知道这里发生了什么? numPy错了吗?我在ZFC中发现了不一致吗?或者只是我在线性代数,Python,numPy或三者的某种组合中成为菜鸟?

感谢您提供的任何帮助。另外,这是我的第一个SO问题(我过去曾经活跃在cstheory.se上),所以任何关于提高我的问题清晰度的建议也会受到赞赏。

1 个答案:

答案 0 :(得分:9)

你只是误解了eig的回归。根据文档,第二个返回参数是

  

标准化(单位“长度”)特征向量,例如列   v [:,i]是对应于特征值w [i]的特征向量。

因此,对应于特征值1的特征向量不是[ 0.4472136 , -0.70710678],而是[-0.70710678, -0.70710678],因为可以很容易地验证:

>>> markov.dot([ 0.4472136 , -0.70710678]) # not an eigenvector
array([ 0.21634952, -0.59167474])
>>> markov.dot([-0.70710678, -0.70710678]) # an eigenvector
array([-0.70710678, -0.70710678])