householder变换qr分解matlab_QR分解

householder变换qr分解matlab_QR分解_第1张图片

A = QR

任何的实方阵都可以做QR分解:

其中 Q 是正交阵, R 是 upper triangle 矩阵.

Q 作为正交矩阵,有很多很好的特性:

  • det(Q) = ±1, 如果 det(Q) = 1 则为旋转变换,说起旋转变换又会想到SO(n) 李群和李代数
  • 可以给我们提供一组正交基

Gram-Schmidt

我们可以通过Gram–Schmidt来计算Q:

首先定义projection 操作:

也就是把

投影到
方向上。

householder变换qr分解matlab_QR分解_第2张图片

假设

, 那么可以找到一组正交基:

A 可以表示为:

所以有:

这个 R 为上三角矩阵由上面的计算过程看起来是一目了然,实际上我们动脑想一想也会觉得很清楚,因为

定义了
,而
则完全由
确定
只会由
确定,所以当然就是上三角的。

不过实际上, Gram-Schmidt 计算方式并不是很数值稳定,想象一下矩阵:

,其实计算过程可能会出很大的问题。因为除以一个极小的数可能会带来很多无效数据。

Householder变换

projection 我们也可以写成矩阵形式:

点乘复合交换律和结合律,所以我们可以继续写成:

这里

是一个 3 x 3 的矩阵,所以

又称作投影的矩阵形式。它本身也有一些特性,比如对称、比如

....

接着来看反射操作:

householder变换qr分解matlab_QR分解_第3张图片
图片来自wikipedia

我们有反射矩阵:

为什么要引入这个反射矩阵?

wikipedia 上有关于这个矩阵的说法:

豪斯霍尔德变换可以将向量的某些元素置零,同时保持该向量的范数不变。
将非零列向量
变换为单位基向量
的豪斯霍尔德矩阵为

其中豪斯霍尔德向量
满足:

这个矩阵有特性包括:

假设

是矩阵 A 的第一列, 有
:

也就做完这个操作可做到:

这就是我们高斯消元法做的第一步,这也是让我们朝着上三角迈进的第一步。 我们可以继续执行,最终我们可以得到上三角矩阵:

Gram-Schmidt 和 Householder 对于

分解会有稍许不同:
  • Gram-Schmidt :
  • Householder:

在计算中,Householder 的数值稳定性会稍优于 Gram-Schmidt.

计算

同样,QR 分解直接 scipy.linalg.qr:

import numpy as np
from scipy import linalg

a = np.array([[12, -51, 4],
              [6, 167, -68],
              [-4, 24, -41]])

q, r = linalg.qr(a)

q
# array([[-0.85714286,  0.39428571,  0.33142857],
#       [-0.42857143, -0.90285714, -0.03428571],
#       [ 0.28571429, -0.17142857,  0.94285714]])

r 
# array([[ -14.,  -21.,   14.],
#       [   0., -175.,   70.],
#       [   0.,    0.,  -35.]])

np.allclose(np.dot(q, r), a) # True

跟上面写的不太一样是因为我们基

的方向有些不一样。

(我感觉 A = QR 稳定性不是很好的感觉,感觉 A 有一点点扰动, QR 就会剧烈变换。

参考:

  • QR_decomposition
  • Householder transformation

你可能感兴趣的:(householder变换qr分解matlab_QR分解)