不正确的特征向量,但通过 python 的 numpy 的 QR 算法正确的特征值
Incorrect eigenvectors but correct eigenvalues by QR algorithm with numpy of python
我做了一个很简单的二维码算法代码,returns特征值和特征向量。
在许多情况下,它运作良好。
但是,在某些情况下,尽管特征值是正确的,但它 returns 不正确的特征向量。
例如,一个矩阵:
[[52,30,49,28],[30,50,8,44],[49,8,46,16],[28,44,16,22]]
,
该过程 returns 更正特征值和特征向量。
但是,在以下情况下:
[[1,-2,0,5],[0,7,1,5],[0,4,4,0],[0,0,0,2]]
,
它 returns 具有正确特征值的不正确特征向量。
我通过 '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'采用的Household反射算法的问题?
我必须应用 Givens 旋转吗?
或者,是我二维码算法码的问题?
当输入矩阵对称时,QR 算法已知能够同时获得特征值和特征向量,但对于非对称情况,则没有这样的承诺。
因此,您的第一个输入矩阵之所以有效,是因为它是对称的。
你的第二个输入矩阵不对称。
我做了一个很简单的二维码算法代码,returns特征值和特征向量。 在许多情况下,它运作良好。 但是,在某些情况下,尽管特征值是正确的,但它 returns 不正确的特征向量。
例如,一个矩阵:
[[52,30,49,28],[30,50,8,44],[49,8,46,16],[28,44,16,22]]
,
该过程 returns 更正特征值和特征向量。
但是,在以下情况下:
[[1,-2,0,5],[0,7,1,5],[0,4,4,0],[0,0,0,2]]
,
它 returns 具有正确特征值的不正确特征向量。
我通过 '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'采用的Household反射算法的问题? 我必须应用 Givens 旋转吗? 或者,是我二维码算法码的问题?
当输入矩阵对称时,QR 算法已知能够同时获得特征值和特征向量,但对于非对称情况,则没有这样的承诺。
因此,您的第一个输入矩阵之所以有效,是因为它是对称的。
你的第二个输入矩阵不对称。