首先来复习线性代数中几个重要的概念。
1)如果一个复矩阵A = A*(共轭转置),则A称为Hermitian矩阵。(注意,矩阵A转置后仍为其本身,显然A一定是方阵。)
2)关于正定矩阵的定义:
- Mn×n 是一个对称的实矩阵,对于任意的(由n个实数组成)的非零列向量z,都有 zTMz > 0,则称M是正定的(positive definite)的。
- More generally,Mn×n 是一个Hermitian矩阵,对于任意的(由n个复数组成)的非零列向量z,都有 z*Mz > 0,则称M是正定的。
实对称矩阵为正定矩阵的充要条件是的各顺序主子式都大于零。实二次型矩阵(注意二次型矩阵必然也是对称矩阵)为正定二次型的充要条件是的矩阵的特征值全大于零。
矩阵的Cholesky分解
如果矩阵A是正定的,那么它可以被(唯一地)分解为一个下三角矩阵L和其共轭转置L*的乘积,这就是所谓的“矩阵的Cholesky分解”。对于实矩阵而言,即 A =LLT,其中L是一个下三角矩阵。下面是一个3×3的矩阵Cholesky分解的示意。
具体要如何来计算Cholesky分解的值呢?通过观察,结合矩阵乘法的规则,不难发现矩阵L对角线上的元素可以由如下规律算得:
推广后得到:
对于那些位于对角线以下的元素lik,其中i>k,则会有下面这样的计算规律:
仍然可以推广得到一个更加普适的公式:
在数学软件/工具中计算矩阵的Cholesky分解
当然了,在很多数学软件或工具中都已经内置了现成的函数,我们并不需要手动去执行那些繁琐的计算。下面来看一个具体的例子:
首先在R中来验证上面的Cholesky分解结果。注意函数chol返回的是一个上三角矩阵,如果要得到下三角矩阵只要对该结果做一下转置处理即可。
> m = matrix(c(4, 12, -16, 12, 37, -43, -16, -43, 98), nrow=3, ncol=3)
> m
[,1] [,2] [,3]
[1,] 4 12 -16
[2,] 12 37 -43
[3,] -16 -43 98
> chol(m)
[,1] [,2] [,3]
[1,] 2 6 -8
[2,] 0 1 5
[3,] 0 0 3
最后再来看看在MATLAB中对矩阵进行Cholesky分解的演示。我们选择得到下三角矩阵的结果,刚好是上面R中计算的上三角矩阵的转置。
>> A = [4 12 -16
12 37 -43
-16 -43 98];
>> [L] = chol(A,'lower')
L =
2 0 0
6 1 0
-8 5 3
而且,你还可以验证原对称矩阵是正定的。如下可见,矩阵的三个特征值都是大于零的。
>> [v,d]=eig(A)
v =
0.9634 0.2127 -0.1630
-0.2648 0.8490 -0.4573
0.0411 0.4838 0.8742
d =
0.0188 0 0
0 15.5040 0
0 0 123.4772
最后一个问题,Cholesky分解在实际中有什么用?其中一个非常重要的应用就是解方程组 Ax = B,其中A是一个正定矩阵。因为A是一个正定矩阵,所以有A =LLT,其中L是一个下三角矩阵。原方程组可以写成 LLTx = B。如果令 y = LTx ,则有Ly = B。注意到其中L是一个下三角矩阵,所以从下向上求解y是非常非常容易的!求解出y之后,在按照类似的方法求解y = LTx 中的 x,而其中LT是一个上三角矩阵,所以最终求出 x 就也是非常非常容易的!
参考文献与其他推荐阅读材料
1)关于 Hermitian矩阵,可以参考《线性代数笔记(6):内积空间(下) 》
2)关于二次型,可以参考《Hessian矩阵与多元函数极值 》
3)http://rosettacode.org/wiki/Cholesky_decomposition
(本文完)