Numpy中的Cholesky分解及其常见错误
在本文中,我们将介绍Numpy中的Cholesky分解以及可能出现的LinAlgError错误类型。
阅读更多:Numpy 教程
什么是Cholesky分解?
Cholesky分解是一种矩阵分解方法,可以将一个对称正定矩阵分解为一个下三角矩阵和其转置矩阵的乘积。对于一个实对称正定矩阵A,存在一个下三角矩阵L,使得A=LL^T。其中,对于任意一个非零列向量x,都有x^TAx>0,也就是说,其对应的二次型函数是正定的。
利用 Cholesky 分解,我们可以通过解 Lz=b 和 L^Tx=z 系统方程来求解 Ax=b 线性方程组。此外,Cholesky 分解还可以用于矩阵的逆、特征值和特征向量等问题。
在 Numpy 中,我们可以使用 numpy.linalg.cholesky()
函数进行 Cholesky 分解。
import numpy as np
A = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 98]])
L = np.linalg.cholesky(A)
L
输出结果为:
array([[ 2., 0., 0.],
[ 6., 1., 0.],
[-8., 5., 3.]])
我们可以将 LL^T 验证一下:
np.allclose(A, np.dot(L, L.T))
输出结果为 True
,说明分解成功。
LinAlgError错误类型
然而,当我们使用 numpy.linalg.cholesky()
函数进行 Cholesky 分解时,可能会遇到一个十分常见的异常情况——LinAlgError 错误。
LinAlgError 错误有两种常见情况,分别为不对称矩阵和非正定矩阵。
不对称矩阵
不对称矩阵无法进行 Cholesky 分解,因为 Cholesky 分解要求矩阵是对称的。如果我们尝试分解一个不对称矩阵,就会得到以下异常:
A = np.array([[4, 12, -16], [12, 37, -43], [-17, -43, 98]])
np.linalg.cholesky(A)
输出如下:
LinAlgError Traceback (most recent call last)
<ipython-input-4-43c817a8a9a8> in <module>()
1 A = np.array([[4, 12, -16], [12, 37, -43], [-17, -43, 98]])
----> 2 np.linalg.cholesky(A)
<__array_function__ internals> in cholesky(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/numpy/linalg/linalg.py in cholesky(a)
763 a, wrap = _makearray(a)
764 _assert_stacked_2d(a)
--> 765 _assert_stacked_square(a)
766 t, result_t = _commonType(a)
767
/usr/local/lib/python3.7/dist-packages/numpy/linalg/linalg.py in _assert_stacked_square(*arrays)
213 for a in arrays:
214 if a.ndim < 2:
--> 215 raise LinAlgError('%d-dimensional array given. Array must be '
216 'at least two-dimensional' % a.ndim)
217 if a.shape[-2] != a.shape[-1]:
LinAlgError: Last 2 dimensions of the array must be square
错误信息为 LinAlgError: Last 2 dimensions of the array must be square
,意思是矩阵最后两个维度必须是方阵。
非正定矩阵
如果我们尝试对一个不是正定的矩阵进行 Cholesky 分解,也会得到 LinAlgError 错误。这是因为 Cholesky 分解要求矩阵是正定的,而非正定矩阵无法进行 Cholesky 分解。
A = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 95]])
np.linalg.cholesky(A)
输出如下:
LinAlgError Traceback (most recent call last)
<ipython-input-3-96258885c410> in <module>()
1 A = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 95]])
----> 2 np.linalg.cholesky(A)
<__array_function__ internals> in cholesky(*args, **kwargs)
/usr/local/lib/python3.7/dist-packages/numpy/linalg/linalg.py in cholesky(a)
754 t, result_t = _commonType(a)
755 signature = 'D->D' if isComplexType(t) else 'd->d'
--> 756 r = gufunc(a, signature=signature, extobj=extobj)
757
758 return wrap(r.astype(result_t, copy=False))
LinAlgError: Matrix is not positive definite
错误信息为 LinAlgError: Matrix is not positive definite
,意思是矩阵不是正定矩阵。
总结
Cholesky 分解是一种重要的矩阵分解方法,可以用于求解线性方程组、矩阵逆、特征值和特征向量等问题。不过在使用 numpy.linalg.cholesky()
函数进行分解时,我们需要特别注意输入矩阵是否是对称正定矩阵。如果输入的矩阵不符合条件,就会得到 LinAlgError 错误。在实际应用中,我们需要先检查输入矩阵是否满足要求,避免出现错误。