一、简介 QR分解法是三种将矩阵分解的方式之一。这种方式,把矩阵分解成一个正交矩阵与一个上三角矩阵的积。QR 分解经常用来解线性最小二乘法问题。QR 分解也是特定特征值算法即QR算法的基础。同时,QR分解后的矩阵与原矩阵的条件数保持一致。
【Math|QR分解】QR分解的实际计算有很多方法,例如Givens旋转、Householder变换,以及Gram-Schmidt正交化等等。每一种方法都有其优点和不足。
详解
文章图片
二、实现 通过Householder变换实现QR分解。
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 15 13:46:30 2016QR分解@author: Administrator
"""from numpy import *
from numpy.linalg import normdef householder(x,y):
m = x.shape[0]
n = y.shape[0]
if m != n:
return
y = sign(x[0]) * norm(x) * y / norm(y)
u = x - y
I = eye(n,dtype=float)
H = I - 2 * outer(u,u) / inner(u,u)
return Hdef qr(A):
m,n = A.shape
R = A.copy()
Q = zeros((n,n),dtype=float)
for i in range(0,n):
Q[i,i] = 1
for i in range(0,n-1):
x = R[i:n,i].getA1()
y = zeros(n-i,dtype=float)
y[0] = 1
temp_H = householder(x,y)
H = eye(n,n,dtype=float)
H[i:n,i:n] = temp_H[0:n-i,0:n-i]
Q = dot(Q,H)
R = dot(H,R)
return Q,Rif __name__ == '__main__':
A = array([[1,2,3,4,0],[-1,3,sqrt(2),3,0],[-2,2,e,pi,0],[-sqrt(10),2,-3,7,0],[0,2,7,5/2,0]],dtype=float)
A = matrix(A,dtype=float)
Q,R = qr(A)
print R