特征向量的 QR 方法 Python
QR method for eigenvectors Python
我正在尝试使用 QR 方法查找矩阵 A 的特征向量。我找到了对应于最大特征值的特征值和特征向量。如何在不使用 numpy.linalg.eig 的情况下找到其余的特征向量?
import numpy as np
A = np.array([
[1, 0.3],
[0.45, 1.2]
])
def eig_evec_decomp(A, max_iter=100):
A_k = A
Q_k = np.eye(A.shape[1])
for k in range(max_iter):
Q, R = np.linalg.qr(A_k)
Q_k = Q_k.dot(Q)
A_k = R.dot(Q)
eigenvalues = np.diag(A_k)
eigenvectors = Q_k
return eigenvalues, eigenvectors
evals, evecs = eig_evec_decomp(A)
print(evals)
# array([1.48078866, 0.71921134])
print(evecs)
# array([[ 0.52937334, -0.84838898],
# [ 0.84838898, 0.52937334]])
接下来我检查条件:
Ax=wx
Where:
A - Original matrix;
x - eigenvector;
w - eigenvalue.
检查条件:
print(np.allclose(A.dot(evecs[:,0]), evals[0] * evecs[:,0]))
# True
print(np.allclose(A.dot(evecs[:,1]), evals[1] * evecs[:,1]))
# False
算法中没有承诺 Q_k
会将特征向量作为列。存在正交本征基的情况甚至相当罕见。这非常特殊,以至于这种情况有一个名字,这些是 normal 矩阵,其特征在于它们与转置交换。
一般来说,你收敛到的 A_k
仍然是上三角,对角线上方有非平凡的内容。通过计算 Q_k.T @ A @ Q_k
检查。从该结构可知,第i
个特征向量是Q_k
的前k
列的线性组合。这可以在一定程度上简化特征向量方程的求解。或者直接求收敛的A_k
的特征向量,用Q_k
.
变换回来
我正在尝试使用 QR 方法查找矩阵 A 的特征向量。我找到了对应于最大特征值的特征值和特征向量。如何在不使用 numpy.linalg.eig 的情况下找到其余的特征向量?
import numpy as np
A = np.array([
[1, 0.3],
[0.45, 1.2]
])
def eig_evec_decomp(A, max_iter=100):
A_k = A
Q_k = np.eye(A.shape[1])
for k in range(max_iter):
Q, R = np.linalg.qr(A_k)
Q_k = Q_k.dot(Q)
A_k = R.dot(Q)
eigenvalues = np.diag(A_k)
eigenvectors = Q_k
return eigenvalues, eigenvectors
evals, evecs = eig_evec_decomp(A)
print(evals)
# array([1.48078866, 0.71921134])
print(evecs)
# array([[ 0.52937334, -0.84838898],
# [ 0.84838898, 0.52937334]])
接下来我检查条件:
Ax=wx
Where:
A - Original matrix;
x - eigenvector;
w - eigenvalue.
检查条件:
print(np.allclose(A.dot(evecs[:,0]), evals[0] * evecs[:,0]))
# True
print(np.allclose(A.dot(evecs[:,1]), evals[1] * evecs[:,1]))
# False
算法中没有承诺 Q_k
会将特征向量作为列。存在正交本征基的情况甚至相当罕见。这非常特殊,以至于这种情况有一个名字,这些是 normal 矩阵,其特征在于它们与转置交换。
一般来说,你收敛到的 A_k
仍然是上三角,对角线上方有非平凡的内容。通过计算 Q_k.T @ A @ Q_k
检查。从该结构可知,第i
个特征向量是Q_k
的前k
列的线性组合。这可以在一定程度上简化特征向量方程的求解。或者直接求收敛的A_k
的特征向量,用Q_k
.