📑 查看全课大纲(第 81 / 93 节)
- 1.概论和集合的定义
- 2.逼疯康托的实数集理论
- 3.常用不等式与映射
- 4.函数及特殊函数
- 5.序列极限的定义
- 6.序列极限的性质与夹逼定理
- 7.重要极限
- 8.无穷小量,无穷大量和一组重要的阶的比较关系
- 9.聚点原理
- 10.函数极限及其性质
- 11.重要极限与等价无穷小
- 12.连续函数
- 13.导数的概念(那些年,扛起牛顿的胡克)
- 14.定义法求导
- 15.函数四则运算的导数与反函数求导法则
- 16.复合函数,隐函数,参数式求导
- 17.不定式求导之“洛必达与伯努利的师生情”
- 18.一阶微分
- 19.高阶导数
- 20.高阶微分
- 21.罗尔中值定理与拉格朗日中值定理
- 22.柯西空降科学院遭排挤
- 23.泰勒公式与泰勒的克妻属性
- 24.利用泰勒展开唯一性定理计算泰勒展开
- 25.泰勒公式的余项估计
- 26.极值问题与导数
- 27.函数凹凸性
- 28.无卵用的渐近线与函数作图
- 29.不定积分的定义
- 30.第一换元法
- 31.第二换元法
- 32.分部积分法
- 33.有理式积分
- 34.三角替换
- 35.定积分的概念
- 36.定积分的性质与积分中值定理
- 37.变上限定积分
- 38.微积分基本定理之“高斯教你如何优雅地装逼”
- 39.定积分的换元法
- 40.奇偶函数与周期函数的定积分
- 41.曲线求长与不可求长曲线(海岸线居然算不出长度?)
- 42.旋转体体积
- 43.旋转体侧面积
- 44.极坐标下图形的面积(数学系常用表白曲线)
- 45.欧式空间
- 46.点列极限,开集与闭集
- 47.多元函数的定义
- 48.多元函数的极限
- 49.多元连续函数
- 50.一阶偏导数
- 51.高阶偏导数
- 52.全微分
- 53.方向导数与梯度
- 54.链式法则
- 55.一阶全微分形式的不变性与高阶微分
- 56.多元函数的泰勒公式
- 57.隐函数存在定理与逆映射存在定理
- 58.多元函数的极值
- 59.矩阵基础知识
- 60.行列式的定义与特殊矩阵的行列式
- 61.行列式的性质
- 62.行列式按k行展开
- 63.线性方程组初步与高斯消元法
- 64.齐次线性方程组与Cramer法则
- 65.线性空间
- 66.线性相关与线性无关
- 67.向量组的秩
- 68.矩阵的秩与线性方程组有解的充要条件
- 69.齐次线性方程组的解集结构
- 70.非齐次线性方程组解集结构
- 71.基与维数
- 72.矩阵的乘法
- 73.特殊矩阵
- 74.矩阵乘积的秩与行列式
- 75.矩阵的逆
- 76.正交矩阵
- 77.矩阵对角化与特征值特征向量
- 78.实对称矩阵对角化
- 79.二次型与正定矩阵
- 80.LU分解
- 81.Cholesky分解
- 82.SVD分解
- 83.线搜索
- 84.步长
- 85.最速下降法和牛顿法
- 86.共轭梯度法
- 87.拟牛顿法
- 88.无约束优化
- 89.若干知识点补充(一)
- 90.若干知识点补充(二)
- 91.凸优化问题
- 92.对偶问题(一)
- 93.对偶问题(二)
Cholesky分解
约 18 分钟
Cholesky 分解
小象实战讲义 · 人工智能数学基础
在求解线性方程组、矩阵求逆等核心线性代数运算中,算法的效率至关重要。当矩阵具有特殊的“正定性”时,我们可以利用其优良的数学性质,采用一种比通用LU分解快约一倍的分解方法—Cholesky分解。本节将深入讲解Cholesky分解的定义、唯一性、构造性证明、高效算法及其在检验矩阵正定性、求解线性方程组和矩阵求逆中的关键应用,帮助你掌握这一处理正定矩阵的利器。
💡 核心导读
本节你将了解到:
- 定义与唯一性:Cholesky分解是正定矩阵的“平方根”分解,形式为 ,其中 是对角元为正的下三角矩阵,且分解唯一。
- 构造与算法:通过数学归纳法和对称的初等行列变换,可以构造性地证明分解的存在性,并推导出时间复杂度为 的实用算法。
- 核心应用一:检验正定性:尝试对矩阵进行Cholesky分解是检验其是否正定的最有效数值方法之一,算法失败即表明矩阵非正定。
- 核心应用二:高效解方程:对于正定线性方程组 ,利用Cholesky分解 并求解两个三角方程组,其复杂度优于通用LU分解。
- 核心应用三:稳定求逆:结合Cholesky分解和下三角矩阵求逆的平方复杂度算法,可以稳定、高效地计算正定矩阵的逆,但仍需注意求逆本身的高计算成本。
1. 定义、性质与直观理解
Cholesky分解(Cholesky decomposition)是专门针对正定矩阵的一种特殊矩阵分解。
定义(Cholesky分解):设 是一个对称正定矩阵。则存在一个唯一的对角元全为正实数的下三角矩阵 ,使得 我们称 为矩阵 的 Cholesky因子。
直观理解:
- 矩阵的“平方根”:正如一个正数 可以写成 ,正定矩阵 可以写成 。因此, 可以视为 的某种“平方根”。
- 唯一性:对于正定矩阵 ,满足上述条件的下三角矩阵 是唯一的。如果 是半正定矩阵,则分解存在但不唯一。
- 不考虑非正定情况:对于非正定(不定或负定)矩阵,我们不讨论其Cholesky分解。
Cholesky分解主要有两个实用出发点:
- 已知正定,进行计算:当我们已知矩阵 是正定的,并需要对其进行某些操作(如解方程、求逆)时,先进行Cholesky分解往往是高效的第一步。
- 检验是否正定:当我们不确定一个对称矩阵是否正定时,可以尝试对其执行Cholesky分解算法。如果算法顺利完成,则 是正定的;如果算法在中途因出现零或负数(如试图对非正数开平方)而失败,则 不是正定矩阵。
2. 存在性证明与计算思想
Cholesky分解的存在性可以通过数学归纳法构造性地证明,这个证明过程也揭示了其核心计算思想。
证明思路(数学归纳法):
- 归纳基础:当 时, 是一个正数。取 ,显然有 ,结论成立。
- 归纳假设:假设对于所有 阶正定矩阵,Cholesky分解存在。
- 归纳步骤:考虑 阶正定矩阵 。因其正定且对称,可进行如下分块: 其中 , 是 维列向量, 是 阶矩阵。
- 消去变换:我们的目标是通过对称的初等行列变换,消去分块中的非对角块 和 。构造下三角矩阵: 对 进行合同变换: 记 。
- 子矩阵的正定性:可以证明, 仍然是正定矩阵。因为合同变换不改变矩阵的正定性,且 的左上角 ,根据正定矩阵的判定定理(各阶顺序主子式大于零),其右下角的 阶子矩阵 也必为正定。
- 递归分解:由归纳假设, 阶正定矩阵 存在Cholesky分解:,其中 是下三角矩阵。
- 组合因子:至此我们已有 对等式两边左乘 、右乘 ,由 ,可得 因此 它是对角元为正的下三角矩阵(, 的对角元由归纳假设为正),且满足 ,归纳完成。对于 阶矩阵,上述“消元—分解”过程可递归执行,最终 等于所有初等下三角矩阵逆的乘积,仍为下三角矩阵。
上述证明过程本质上是高斯消元法在正定矩阵情形下的一个变体,但利用了对称性,只需对矩阵的一半元素进行操作。
算例:以矩阵 为例。
- 第一步:消去 。变换矩阵 。 这里 。
- 对 分解:。
- 组合:根据构造,。 验证:。
3. 算法、复杂度与算例
基于上述构造思想,可以得到Cholesky分解的数值算法(Cholesky–Banachiewicz算法)。
算法描述: 输入: 阶对称正定矩阵 。 输出:下三角矩阵 ,使得 。
- 初始化 为零矩阵。
- For to : a. 计算 。 b. For to : 。
- 返回 。
算法复杂度分析:该算法的主要计算量集中在三重循环的内层求和上。总运算量约为 次浮点运算(FLOPs)。作为对比,通用的LU分解需要约 FLOPs。因此,Cholesky分解的计算量约为LU分解的一半。
稳定性:由于正定矩阵的顺序主子式均大于零,算法中 的计算不会出现对零或负数开根号的情况,因此不需要选主元(pivoting)。这使得Cholesky分解在数值上非常稳定。
下面我们用NumPy来验证Cholesky分解及其应用。
import numpy as np
# 定义一个对称正定矩阵 A
A = np.array([[4.0, 2.0, 1.0],
[2.0, 5.0, 3.0],
[1.0, 3.0, 6.0]])
print("原矩阵 A:")
print(A)
# 应用1: 使用numpy的Cholesky分解,返回下三角矩阵 L,满足 A = L L^T
L = np.linalg.cholesky(A) # 下三角Cholesky因子
L_T = L.T # 上三角因子 L^T
print("\nCholesky因子 L (下三角):")
print(L)
print("\n验证 A = L L^T:")
print(L @ L_T)
# 应用2: 解线性方程组 Ax = b
b = np.array([1.0, 3.0, 2.0])
print(f"\n右端项 b: {b}")
# 方法:先解下三角方程组 Ly = b (前向代入)
# 注:此处用通用solve演示,生产环境可使用scipy.linalg.solve_triangular(L, b, lower=True)优化
y = np.linalg.solve(L, b)
# 再解上三角方程组 L^T x = y (后向代入)
x = np.linalg.solve(L_T, y)
print(f"解线性方程组 Ax=b 的解 x: {x}")
print(f"验证 Ax 是否等于 b: {np.allclose(A @ x, b)}")
# 应用3: 利用分解求逆 A^{-1} = (L^{-1})^T (L^{-1})
# 首先求下三角矩阵L的逆。下三角矩阵的逆也是下三角矩阵,可以通过前向代入法高效求解。
# 这里我们使用一个简单实现(对于教学演示),实际中可使用scipy.linalg.solve_triangular。
def invert_lower_triangular(L):
"""求下三角矩阵L的逆。假设L非奇异且为下三角。"""
n = L.shape[0]
invL = np.zeros_like(L)
for i in range(n):
invL[i, i] = 1.0 / L[i, i] # 对角线元素
for j in range(i):
s = 0.0
for k in range(j, i+1): # 注意求和范围
# 更精确的写法是:对于i>j, sum(L[i,k]*invL[k,j]) for k=j to i-1
if k < i: # 当k=i时,是L[i,i]*invL[i,j],此项是待求的,移到等式左边
s += L[i, k] * invL[k, j]
# L[i,i]*invL[i,j] + s = 0 => invL[i,j] = -s / L[i,i]
invL[i, j] = -s / L[i, i]
return invL
invL = invert_lower_triangular(L)
invA_via_cholesky = invL.T @ invL
print("\n通过Cholesky分解求得的逆矩阵 A_inv:")
print(invA_via_cholesky)
# 与numpy直接求逆的结果对比
invA_np = np.linalg.inv(A)
print("\nNumPy直接求逆的结果:")
print(invA_np)
print(f"\n两种方法结果是否接近: {np.allclose(invA_via_cholesky, invA_np)}")4. 三大核心应用场景
4.1 检验矩阵的正定性
这是Cholesky分解一个非常独特且重要的应用。对于一个对称矩阵 ,要判断其是否正定,最直接的数值方法就是尝试进行Cholesky分解。
- 如果分解成功完成,则 是正定矩阵,并且同时得到了其Cholesky因子 。
- 如果分解过程中失败(例如,在计算 时遇到 ),则 不是正定矩阵(可能是半正定或不定)。 这种方法的时间复杂度为 ,是检验正定性的高效数值手段。
4.2 求解正定线性方程组
对于线性方程组 ,其中 是 正定矩阵。
- 首先计算Cholesky分解:。
- 原方程化为 。
- 令 ,则先解 下三角方程组 (前向代入,复杂度 )。
- 再解 上三角方程组 (后向代入,复杂度 )。
总复杂度主要由Cholesky分解的 主导,优于使用LU分解的 。在科学计算中,对于大规模正定系统(如来自有限元法、优化问题),Cholesky分解是首选方法。
4.3 计算正定矩阵的逆
虽然直接求逆通常应避免,但在某些情况下不可避免。对于正定矩阵 ,利用Cholesky分解可以稳定地求逆: 关键在于求下三角矩阵 的逆 。由于 是下三角矩阵,其逆也是下三角矩阵,并且可以通过简单的前向代入法以 的复杂度求得(如前面代码示例所示)。因此,总的求逆复杂度仍由Cholesky分解的 决定。
重要提醒:尽管这种方法比通用的高斯消元法求逆()在常数因子上有优势,但矩阵求逆本身始终是 复杂度的操作,计算成本很高。在机器学习和优化中,许多涉及逆矩阵的公式(如正态方程 )都可以通过Cholesky分解求解线性方程组来规避显式求逆,这是更优的实践。
📝 动手练一练
- 手动计算:对以下正定矩阵 进行Cholesky分解,即求下三角矩阵 使得 。
- 编程验证:使用NumPy的
np.linalg.cholesky函数验证你手算的 是否正确,并利用该分解求解方程组 。
参考答案:
手算过程: 设 。 由 : 。 比较元素:
- (取正)。
- 。
- (取正)。 因此,。
编程验证:
import numpy as np A = np.array([[9.0, 3.0], [3.0, 5.0]]) b = np.array([12.0, 11.0]) # 使用numpy的Cholesky分解,返回下三角因子 L L_np = np.linalg.cholesky(A) L_T_np = L_np.T # 上三角因子 L^T print("NumPy计算的 L:") print(L_np) # 验证分解 print("\n验证 A = L L^T:") print(L_np @ L_T_np) # 解方程 Ly = b y = np.linalg.solve(L_np, b) # 解方程 L^T x = y x = np.linalg.solve(L_T_np, y) print(f"\n方程的解 x: {x}") print(f"验证 Ax = b: {np.allclose(A @ x, b)}")
本章小结
本节深入探讨了针对对称正定矩阵的Cholesky分解。
要点回顾:
- 定义:正定矩阵 可唯一分解为 , 是对角元为正的下三角矩阵。
- 算法与复杂度:基于高斯消元思想的Cholesky算法复杂度约为 ,且因正定性保证而无需选主元,数值稳定。
- 核心应用:
- 高效检验正定性:尝试分解是最实用的数值判定方法。
- 快速求解线性方程组:对于 ,分解后求解两个三角方程组,速度快于通用LU分解。
- 稳定求逆:结合下三角矩阵求逆,可稳定计算 ,但应优先考虑避免显式求逆的方案。
行动清单:
- 掌握手算:对于2维或3维简单正定矩阵,能够手动完成Cholesky分解。
- 熟练调用:在Python中,学会使用
np.linalg.cholesky进行分解,并利用其结果解方程。 - 建立条件反射:在后续学习机器学习模型(如高斯过程、优化中的牛顿法)时,遇到对称正定矩阵,优先考虑使用Cholesky分解来提升计算效率和数值稳定性。
— 小象教研组
- 第10章讲义(含板书):线性代数(PDF · 15.5MB)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问