特征向量不正确,但使用numpy的QR算法通过QR算法纠正特征值

时间:2019-06-03 06:10:48

标签: python numpy eigenvalue eigenvector

我制作了一个非常简单的QR算法代码,该代码返回特征值和特征向量。 在许多情况下,它运作良好。 但是,在某些情况下,即使特征值正确,它也会返回不正确的特征向量。

例如,以下矩阵: [[52,30,49,28],[30,50,8,44],[49,8,46,16],[28,44,16,22]], 该过程返回正确的特征值和特征向量。 但是,在以下情况下: [[1,-2,0,5],[0,7,1,5],[0,4,4,0],[0,0,0,2]], 它返回具有正确特征值的错误特征向量。 我通过“ eigh”功能检查了正确的值,所有正确的特征值和特征向量均为实数。因此,这不是复数的问题。 我不明白为什么会这样。

import numpy as np 

def process(self, mat: List[List[float]]):
    check = True
    a = mat[:]
    residual = 0.00001
    eigenValues = []
    eigenVectors = np.eye(len(mat))

    while check:
        check = False
        q, r = np.linalg.qr(a)
        a = np.dot(r, q)
        eigenVectors = np.dot(eigenVectors, q)

        for i in range(len(mat)):
            for j in range(i):
                if abs(a[i][j]) > residual: check = True

    for i in range(len(a)): eigenValues.append(a[i][i])

    print(eigenValues) #[1.0, 8.000000054834647, 2.9999999451653365, 2.0]
    print(eigenVectors) #[[1.0, 0.0, 0.0, 0.0], 
                          [0.0, 0.7071067941112008, -0.7071067682618934, 0.0], 
                          [0.0, 0.7071067682618939, 0.7071067941112008, 0.0], 
                          [0.0, 0.0, 0.0, 1.0]]
    # The correct eigenvectors are 
       [[ 1.         -0.19802951  0.23570226  0.90744251],
        [ 0.          0.69310328 -0.23570226 -0.1814885 ],
        [ 0.          0.69310328  0.94280904  0.362977  ],
        [ 0.          0.          0.          0.1088931 ]]

“ numpy.linalg.qr”采用的家用反射算法是否有问题? 我是否必须应用Givens轮换? 或者,这与我的QR算法代码有关吗?

1 个答案:

答案 0 :(得分:0)

众所周知,当输入矩阵对称时,QR算法能够同时获得特征值和特征向量,但对于非对称情况,则没有这样的希望。

因此,您的第一个输入矩阵有效,因为它是对称的。

您的第二个输入矩阵不对称。