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分解