我正在使用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。这是原始论文(见第9页、第10页)的结果,枢纽得分收敛于A*A^T的主特征向量。最终,我们想要将这些枢纽得分相互比较,因此符号实际上很重要。
在第10页,论文还说:“另外(作为推论),如果M只有非负条目,则M的主特征向量只有非负条目。”这就是我提出这个问题的原因。