Numpy中的Cholesky分解及其常见错误

Numpy中的Cholesky分解及其常见错误

在本文中,我们将介绍Numpy中的Cholesky分解以及可能出现的LinAlgError错误类型。

阅读更多:Numpy 教程

什么是Cholesky分解?

Cholesky分解是一种矩阵分解方法,可以将一个对称正定矩阵分解为一个下三角矩阵和其转置矩阵的乘积。对于一个实对称正定矩阵A,存在一个下三角矩阵L,使得A=LL^T。其中,对于任意一个非零列向量x,都有x^TAx>0,也就是说,其对应的二次型函数是正定的。

利用 Cholesky 分解,我们可以通过解 Lz=bL^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 错误。在实际应用中,我们需要先检查输入矩阵是否满足要求,避免出现错误。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程