我正在使用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的主特征向量只有非负项。”这就是我问这个问题的原因。
答案 0 :(得分:8)
特征向量的符号是任意的。据我所知,在这方面没有正确或错误的答案。
答案 1 :(得分:1)
如果您利用MM
,MM == 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将矢量标准化为一。