Math|QR分解

一、简介 QR分解法是三种将矩阵分解的方式之一。这种方式,把矩阵分解成一个正交矩阵与一个上三角矩阵的积。QR 分解经常用来解线性最小二乘法问题。QR 分解也是特定特征值算法即QR算法的基础。同时,QR分解后的矩阵与原矩阵的条件数保持一致。
【Math|QR分解】QR分解的实际计算有很多方法,例如Givens旋转、Householder变换,以及Gram-Schmidt正交化等等。每一种方法都有其优点和不足。
详解
Math|QR分解
文章图片

二、实现 通过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

    推荐阅读