线性代数笔记: Cholesky分解

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性代数笔记: Cholesky分解相关的知识,希望对你有一定的参考价值。

1 介绍

        当一个实矩阵A是对称正定矩阵的时候,它可以分解成一个下三角矩阵L以及它的转置的乘积,即:

  1.1 矩阵半正定的情况

        如果矩阵是正定的话,那么L唯一确定;如果矩阵是半正定的话,那么也可以分解,不过此时L不唯一。

 2 举例

3 使用  scipy.linalg.cholesky求解

3.1 用法

scipy.linalg.cholesky(
    a, 
    lower=False, 
    overwrite_a=False, 
    check_finite=True)

 返回值:c:(M,M)ndarray,表示a的上三角或下三角Cholesky因子。

 3.2 参数介绍

a

(M, M) array_like

待分解的矩阵

lower

bool, 可选参数

是计算上三角Cholesky还是下三角Cholesky分解。默认值为upper-triangular

overwrite_a

bool, 可选参数

是否覆盖a中的数据(可能会提高性能)

check_finite

bool, 可选参数

是否检查输入矩阵仅包含有限数。禁用可能会提高性能,但是如果输入中确实包含无穷大或NaN,则会导致问题(崩溃,终止)。

3.3 用法举例 

import numpy as np
from scipy import linalg

a = np.array([[4, 12, -16],
              [12, 37, -43],
              [-16, -43, 98]])
L_lower = linalg.cholesky(a, lower=True) 
# 默认计算 upper, 所以指定 lower = True
L_upper = linalg.cholesky(a) 
print(L_lower,'\\n',L_upper)
'''
[[ 2.  0.  0.]
 [ 6.  1.  0.]
 [-8.  5.  3.]] 
 [[ 2.  6. -8.]
 [ 0.  1.  5.]
 [ 0.  0.  3.]]
'''
print(L_lower @ L_upper)
'''
[[  4.  12. -16.]
 [ 12.  37. -43.]
 [-16. -43.  98.]]
'''

4 平方根法求L

我们假设矩阵A可以分解成

的结果为:

  • 首先我们看第一个元素:
  • 然后我们看第一列的其他元素:         
  • 之后,我们假设已经算出了L矩阵的前k-1列元素
    • 通过  ,可以得到:
    • 进一步再由,可以得到: 
  • 于是我们可以通过以上方式迭代求得L

 5 在计算机编程中 Cholesky分解的作用

         在计算机程序中常常用到这种方法解线性代数方程组。它的优点是存储量很省。用矩阵A一半的存储空间,就可以表达A的全部信息        

参考资料

数学之美:cholesky矩阵分解_BigCowPeking-CSDN博客_cholesky分解

Cholesky分解 - 知乎 (zhihu.com)

以上是关于线性代数笔记: Cholesky分解的主要内容,如果未能解决你的问题,请参考以下文章

三十分钟理解:矩阵Cholesky分解,及其在求解线性方程组矩阵逆的应用

使用 OpenMP 进行 Cholesky 分解

numpy笔记 linalg

Cholesky 分解的 Matlab Mex C 实现

如果我不使用打印子程序,NaN Cholesky 在 Fortran 中的分解

Python 进行 Cholesky分解