Python - 得到错误的 Cholesky 分解解?
Python - Getting the wrong solution for Cholesky decomposition?
我正在尝试将一些伪代码从 matlab 转换为 python 脚本,但我在获得正确答案时遇到了一些问题?谁能帮我找出我在哪里搞砸了翻译?
我在 Trefethan & Bau 书中给出的 Cholesky 分解伪代码是
如果我正确理解给出的描述,这是针对上三角矩阵完成的,但我认为这也适用于一般矩阵,不是吗?
反正我在python写了下面的代码:
def is_SPD(A):
if np.all(A == A.T):
if np.all(la.eigvals(A) > 0):
return True
return False
def cholesky_decomp(A):
#first check if matrix is symmetric and positive definite
if is_SPD(A) == True:
R = np.copy(A)
for k in range (0, len(A)):
for j in range (k+1, len(A)):
R[j,j:] = R[j,j:] - (R[k,j:]*(R[k,j]/R[k,k]))
R[k,k:] = R[k,k:]/sqrt(R[k,k])
return R
else:
return print('Cholesky decomposition not applicable')
我做的是一个4x4的矩阵,我用np.linalg的方法分解的,结果完全不一样
我觉得这可能?是因为我对 MATLAB 不熟悉,而且我总体上缺乏编码技能,但我根本没有得到任何正确答案,我也不知道我哪里出错了。
我在这里添加了一个我正在使用的样本矩阵,并且这个 shoulddd 适用于,并且应该给出适当的 Cholesky 分解,但我得到一个完全错误的答案。
有人可以用它来帮助我找出我哪里出错了吗?
A = np.array([[16, -12, -12, -16], [-12, 25, 1, -4], [-12, 1, 17, 14], [-16, -4, 14, 57]])
我的代码给了我:
[[ 4 -3 -3 -4]
[-12 4 -2 -4]
[-12 1 2 -3]
[-16 -4 14 4]]
而 numpy Cholesky 函数给了我:
[[ 4. 0. 0. 0.]
[-3. 4. 0. 0.]
[-3. -2. 2. 0.]
[-4. -4. -3. 4.]]
您的代码正确地实现了规定的算法,但请注意文本说(强调):
The input matrix A represents the superdiagonal half of the m×m Hermitian positive definite matrix to be factored.
所以需要替换输入A
,
[[ 16 -12 -12 -16]
[-12 25 1 -4]
[-12 1 17 14]
[-16 -4 14 57]]
来自 np.triu(A)
:
[[ 16 -12 -12 -16]
[ 0 25 1 -4]
[ 0 0 17 14]
[ 0 0 0 57]]
此外(符号略有变化,其中'
表示厄尔米特转置),
The output matrix R represents the upper-triangular factor for which A = R' R
所以你得到一个上三角 R,而 Numpy 的 cholesky
函数给出一个下三角结果。这些结果中的每一个都是另一个结果的厄米特转置版本(参见 here)。
我正在尝试将一些伪代码从 matlab 转换为 python 脚本,但我在获得正确答案时遇到了一些问题?谁能帮我找出我在哪里搞砸了翻译?
我在 Trefethan & Bau 书中给出的 Cholesky 分解伪代码是
如果我正确理解给出的描述,这是针对上三角矩阵完成的,但我认为这也适用于一般矩阵,不是吗?
反正我在python写了下面的代码:
def is_SPD(A):
if np.all(A == A.T):
if np.all(la.eigvals(A) > 0):
return True
return False
def cholesky_decomp(A):
#first check if matrix is symmetric and positive definite
if is_SPD(A) == True:
R = np.copy(A)
for k in range (0, len(A)):
for j in range (k+1, len(A)):
R[j,j:] = R[j,j:] - (R[k,j:]*(R[k,j]/R[k,k]))
R[k,k:] = R[k,k:]/sqrt(R[k,k])
return R
else:
return print('Cholesky decomposition not applicable')
我做的是一个4x4的矩阵,我用np.linalg的方法分解的,结果完全不一样
我觉得这可能?是因为我对 MATLAB 不熟悉,而且我总体上缺乏编码技能,但我根本没有得到任何正确答案,我也不知道我哪里出错了。
我在这里添加了一个我正在使用的样本矩阵,并且这个 shoulddd 适用于,并且应该给出适当的 Cholesky 分解,但我得到一个完全错误的答案。
有人可以用它来帮助我找出我哪里出错了吗?
A = np.array([[16, -12, -12, -16], [-12, 25, 1, -4], [-12, 1, 17, 14], [-16, -4, 14, 57]])
我的代码给了我:
[[ 4 -3 -3 -4]
[-12 4 -2 -4]
[-12 1 2 -3]
[-16 -4 14 4]]
而 numpy Cholesky 函数给了我:
[[ 4. 0. 0. 0.]
[-3. 4. 0. 0.]
[-3. -2. 2. 0.]
[-4. -4. -3. 4.]]
您的代码正确地实现了规定的算法,但请注意文本说(强调):
The input matrix A represents the superdiagonal half of the m×m Hermitian positive definite matrix to be factored.
所以需要替换输入A
,
[[ 16 -12 -12 -16]
[-12 25 1 -4]
[-12 1 17 14]
[-16 -4 14 57]]
来自 np.triu(A)
:
[[ 16 -12 -12 -16]
[ 0 25 1 -4]
[ 0 0 17 14]
[ 0 0 0 57]]
此外(符号略有变化,其中'
表示厄尔米特转置),
The output matrix R represents the upper-triangular factor for which A = R' R
所以你得到一个上三角 R,而 Numpy 的 cholesky
函数给出一个下三角结果。这些结果中的每一个都是另一个结果的厄米特转置版本(参见 here)。