Numpy特征向量计算错误

时间:2014-02-12 22:20:27

标签: python numpy eigenvalue

我正在使用numpy来获取矩阵的特征值/特征向量。我的矩阵是对称的和积极的。

> mat

  matrix([[ 1.,  1.,  0.,  0.,  0.,  0.,  0.],
          [ 1.,  2.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  0.,  1.,  0.,  0.,  0.,  0.],
          [ 0.,  0.,  0.,  2.,  1.,  1.,  0.],
          [ 0.,  0.,  0.,  1.,  2.,  1.,  0.],
          [ 0.,  0.,  0.,  1.,  1.,  1.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.,  1.]])

我使用np.eigh,因为我的矩阵是对称的。

> import numpy.linalg as la
> la.eigh(mat)

  (array([ 0.27,  0.38,  1.  ,  1.  ,  1.  ,  2.62,  3.73]),
   matrix([[ 0.  , -0.85, -0.  ,  0.  ,  0.  ,  0.53,  0.  ],
          [ 0.  ,  0.53, -0.  ,  0.  ,  0.  ,  0.85,  0.  ],
          [ 0.  ,  0.  , -0.  ,  1.  ,  0.  ,  0.  ,  0.  ],
          [-0.33, -0.  , -0.71, -0.  , -0.  , -0.  , -0.63],
          [-0.33, -0.  ,  0.71, -0.  , -0.  , -0.  , -0.63],
          [ 0.89, -0.  , -0.  , -0.  , -0.  , -0.  , -0.46],
          [-0.  , -0.  , -0.  , -0.  ,  1.  , -0.  , -0.  ]]))

我的问题是,其中许多值都有错误的符号。特别是,当它应该是正的时,主特征向量(矩阵中最右边的列)都是负的。我已经对matlab和octave进行了检查。这只是一个精确错误,还是我缺少的东西?

如果是错误,有没有办法检查这样的错误并纠正错误?

编辑:此计算是Hubs and Authorities的一部分,上面的矩阵是A * A ^ T. the original paper (see p.9, p.10)的结果是集线器得分收敛到A * A ^ T的主特征向量。最终,我们希望将这些中心分数相互比较,因此符号实际上很重要。

在第10页,该论文还说,“另外(作为推论),如果M只有非负项,那么M的主特征向量只有非负项。”这就是我问这个问题的原因。

2 个答案:

答案 0 :(得分:8)

特征向量的符号是任意的。据我所知,在这方面没有正确或错误的答案。

答案 1 :(得分:1)

如果您利用MMMM == QQ*DD*QQ.T是对角线上具有特征值的矩阵且{{1},您可以轻松检查对称矩阵DD=diag([lam_1, lam2_,...])的特征分解是否正确作为特征向量的矩阵:

QQ

在你的情况下正确到14位。

注意,特征向量可以乘以任何常数,因为特征值的定义方程lam,QQ = la.eigh(MM) # Check result: DD = np.diag(lam) MM2 = np.dot(np.dot(QQ, DD), QQ.T) print(MM-MM2) # should be zero < => MM*x == lambda*x MM*(c*x) == lambda *(c*x)为任何非零常量。 c取决于数字 - Numpy将矢量标准化为一。