在这篇文章中,我们将了解 Cholesky 分解、与此分解相关的术语定义、用于实现 Cholesky 分解的函数的语法以及一些示例。
什么是矩阵分解?
在线性代数中,矩阵分解或矩阵分解是指将矩阵分解为两个或多个组成部分,这些组成部分相乘时产生原始矩阵。
当矩阵分解为更小的部分时,可以提高效率并进行数据分析。矩阵分解还优化了一些算法,例如最小二乘估计。
乔列斯基分解
Cholesky 分解是将矩阵分解为其下三角矩阵和共轭转置的类型。
在数学上,它被定义为A=LL*
其中 A 是原始矩阵,L 是下三角矩阵,L* 是其共轭转置。
矩阵被 Cholesky 分解需要三个条件。
- 矩阵应该是对称的
- 对于复矩阵,应该是 Hermitian 矩阵
- 矩阵的元素应该是正定的
让我们详细定义每个术语。
方阵
如果矩阵中的行数等于列数,则矩阵被视为方阵。
下面给出了这种矩阵的一个示例。
下三角矩阵
主对角线以上元素为零的方阵称为下三角矩阵。
对称矩阵
如果方阵等于其转置,则方阵是对称的。交换行和列可以获得矩阵的转置。
下面给出一个例子。
共轭转置和埃尔米特矩阵
假设有一个复数项(a+bi)形式的矩阵,则通过替换所有元素的复共轭得到该矩阵的共轭。
矩阵的共轭转置是通过交换共轭矩阵的行和列来获得的。
现在埃尔米特矩阵是一个等于其共轭转置矩阵的方阵。
正定矩阵
如果矩阵的所有特征值均为正,则称对称矩阵为正定矩阵。
可以使用NumPy 库的函数计算矩阵的特征值。 np.linalg.eigenvalsh
让我们看一个例子来检查给定的矩阵是否是正定的。
1
2
3
4
5
6
7
|
#to check if the matrix is positive definite import numpy as np A = np.array([[ 2 , 1 ], [ 1 , 2 ]]) def is_pos_definite(A): eig_vals = np.linalg.eigvalsh(A) return np. all (eig_vals > 0 ) print (is_pos_definite(A)) |
import numpy as np
:我们将 NumPy 库导入为 np 来创建数组并使用其函数。
在下一行中,我们创建一个 2×2 矩阵并将其存储在名为 A 的变量中。
接下来,我们创建一个函数来is_pos_definite
检查矩阵是否是正定的。矩阵 A 作为数组传递给该函数。该def
关键字用于定义一个新函数。
在该函数内部,我们有一个新变量 eig_vals,用于存储矩阵 A 的特征值。用于np.linalg.eigvalsh
计算矩阵 A 的特征值。
在下一行中,我们使用 检查矩阵 A 的特征值是否均为正值(大于零)np.all
。
最后,我们打印该函数的结果。如果矩阵 A 的特征值为正,则此行打印 True。否则打印 False。
输出如下所示。
Cholesky 分解的应用
乔列斯基分解的主要用途是在蒙特卡罗模拟中。
如果您不熟悉蒙特卡罗模拟,请查看这篇有关 Python 中蒙特卡罗的文章。
除了高级计算之外,Cholesky 分解还用于求解线性方程组、找出矩阵求逆以及执行主成分分析 (PCA)。
如果您想了解有关数据缩减的更多信息,请查看这篇有关 PCA 的文章。
探索语法linalg.cholesky decomposition
Cholesky 分解的 NumPy 实现仅采用对称矩阵(实值)或 Hermitian 矩阵(复值),但在这两种情况下,矩阵都应该是正定的。
接受np.linalg.cholesky
方阵 A 并返回矩阵的 LL*。
没有工具可以检查矩阵是否为 Hermitian 矩阵。
A 的下三角矩阵用于计算 Cholesky 分解。
该方法的语法如下。
linalg.cholesky(a) |
语法中只有一个参数。
a:作为参数传递的矩阵应该是类似数组的。接受埃尔米特矩阵和正定矩阵。
返回类型:返回下三角矩阵。
当矩阵不是正定矩阵时,此函数可能会引发异常。这种异常称为LinAlgError
.
查看这篇关于如何解决矩阵相关错误的文章——LinAlgError。
现在我们已经了解了该方法的基本功能,让我们深入研究示例!
计算对称矩阵的 Cholesky 分解
对称矩阵是等于其转置的方阵。
对称并不是矩阵分解的唯一标准。矩阵也应该是正定的。
这是分解对称矩阵的代码,该矩阵也是正定的。
1
2
3
4
|
# Example1 2x2 symmetric matrix import numpy as np B = np.array([[ 7 , 2 ],[ 2 , 1 ]]) print (B) |
在此代码片段中,我们只是将 NumPy 库导入为 np,创建一个二维数组(2×2 矩阵),并将其存储在变量 B 中。
print(B)
用于打印 B 中的矩阵。
让我们求这个矩阵的 Cholesky 分解。
1
2
|
L = np.linalg.cholesky(B) L |
我们正在调用该linalg.cholesky
函数来分解矩阵 B。
该结果存储在 L 中。
输出是一个下三角矩阵,如下所示。
计算 Hermitian 矩阵的 Cholesky 分解
如果一个矩阵等于它自己的共轭转置,则称该矩阵为 Hermitian 矩阵。
同样,厄米矩阵不足以进行分解。该矩阵也应该是正定矩阵。
这是 Hermitian 矩阵的 Cholesky 分解的代码
1
2
3
4
|
#2x2 hermitian matrix import numpy as np C = np.array([[ 2 , 1 - 2j ],[ 1 + 2j , 3 ]]) print (C) |
在第一行中,我们导入 numpy 库。
接下来,我们创建一个名为 C 的新变量,用于存储具有复数的 2×2 Hermitian 矩阵。
接下来,我们将矩阵的元素打印到屏幕上。
输出如下所示。
这是 Cholesky 分解的代码。
1
2
|
L = np.linalg.cholesky(C) L |
分解后的矩阵存储在名为 L 的变量中,该变量是通过 方法获得的linalg.cholesky
。
在下一行中,我们打印矩阵 L 的元素,该矩阵是一个下三角矩阵。
计算 3×3 Hermitian 矩阵的 Cholesky 分解
让我们在这个例子中做一些不同的事情。让我们创建一个埃尔米特矩阵并定义一个新函数来检查该矩阵是否是正定的linalg.eigvalsh
。然后将该矩阵作为参数传递给 Cholesky 方法。
下面给出了创建 3×3 Hermitian 矩阵的代码。
#3x3 hermitian matrix D=np.array([[10, -2 + 3j, 1], [-2 - 3j, 6, 2 + 2j], [1, 2 - 2j, 7]]) print(D) def is_pos_definite(D): eig_vals = np.linalg.eigvalsh(D) return np.all(eig_vals > 0) print(is_pos_definite(D)) |
我们在上面的代码片段中所做的就是创建一个三维数组并将其存储在名为 D 的变量中。
然后,我们定义了一个名为 is_pos_definite 的函数来检查矩阵是否是正定的。
在这个函数中,我们还调用了一个实例,linalg.einvalsh
新创建的矩阵将作为参数传递给该实例。
eig_vals 是一个用于返回矩阵 D 的特征值的对象。
np.all
是 Numpy 库的一种方法,用于检查矩阵的所有特征值是否都大于零。
最后,我们打印上述计算的结果。如果特征值为正,则最后一个打印语句返回 True,否则返回 False。
你认为输出会是什么?
好吧,输出为真,因为作为参数传递的矩阵是正定矩阵。
接下来,我们计算 Cholesky 分解。
L = np.linalg.cholesky(D) L |
输出如下。
输出有点不清楚,所以这里是公式化的下三角矩阵。
LinAlgError 异常说明
在前面的例子中,我们已经看到了正定矩阵的分解。但现在让我们看看如果我们尝试在非正定矩阵的矩阵上使用此方法会发生什么。
#example of LinAlgError exception #3x3 hermitian matrix E=np.array([[1,2-3j,3+4j],[2+3j,0,4-5j],[3-4j,4+5j,2]]) print(E) def is_pos_definite(E): eig_vals = np.linalg.eigvalsh(E) return np.all(eig_vals > 0) print(is_pos_definite(E)) |
在此示例中,非正定 Hermitian 矩阵存储在名为 E 的变量中。
接下来,我们使用之前创建的函数is_pos_definite
来检查 E 是否具有正特征值。
输出如下所示。
输出清楚地表明 E 不是正定矩阵。如果我们将 E 作为参数传递给该linalg.cholesky
方法会发生什么?
1
2
|
L = np.linalg.cholesky(E) L |
如上图所示,linalgerror 升高。这意味着矩阵 E 不是正定的。
结论
总结我们在这篇文章中讨论的所有内容,我们首先从什么是矩阵分解开始,然后是 Cholesky 分解,一些与矩阵线性代数相关的基本术语,例如对称矩阵、矩阵转置、埃尔米特矩阵、正定矩阵, 等等。
我们还看到了矩阵必须满足 Cholesky 方法分解的条件,其中主要条件之一是矩阵应该是正定的。
我们还看到了 Numpy 方法来检查矩阵是否是正定矩阵。
接下来,我们看到了 Cholesky 分解的应用。
我们还看到了该方法的语法、其参数以及返回对象(一个下三角矩阵)。
来看示例,我们已经看到了对称矩阵和埃尔米特矩阵的分解。
最后,我们看到了如果我们尝试分解的矩阵不是正定矩阵,如何引发 LinAlgError 异常。
参考
要了解有关此方法和示例的更多信息,请参阅 NumPy 文档。
查看此 StackOverflow 答案,了解如何消除我们在上一个示例中遇到的异常。