gpt4 book ai didi

r - 正半定矩阵Cholesky分解中pivot的正确使用

转载 作者:行者123 更新时间:2023-12-04 09:35:30 32 4
gpt4 key购买 nike

我不明白如何使用 R 中的 chol 函数来分解正半定矩阵。 (或者我这样做,并且有一个错误。) documentation 状态:

If pivot = TRUE, then the Choleski decomposition of a positive semi-definite x can be computed. The rank of x is returned as attr(Q, "rank"), subject to numerical errors. The pivot is returned as attr(Q, "pivot"). It is no longer the case that t(Q) %*% Q equals x. However, setting pivot <- attr(Q, "pivot") and oo <- order(pivot), it is true that t(Q[, oo]) %*% Q[, oo] equals x ...



以下示例似乎与此描述不符。
> x <- matrix(1, nrow=3, ncol=3)
> Q <- chol(x, pivot=TRUE)
> oo <- order(attr(Q, 'pivot'))
> t(Q[, oo]) %*% Q[, oo]
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 3

结果不是 x 。我是否错误地使用了枢轴?

最佳答案

对于满秩输入,即正定矩阵 x , 我们需要

Q <- chol(x, TRUE)
oo <- order(attr(Q, 'pivot'))
unpivQ <- Q[, oo]
all.equal(crossprod(unpivQ), x)

对于 有效 秩亏输入,即半正定矩阵 x (具有负特征值的不定矩阵是非法的,但未在 chol 中检查),请记住将不足的尾随对角块归零:
Q <- chol(x, TRUE)
r <- attr(Q, 'rank')
if (r < nrow(x)) Q[(r+1):nrow(x), (r+1):nrow(x)] <- 0
oo <- order(attr(Q, 'pivot'))
unpivQ <- Q[, oo]
all.equal(crossprod(unpivQ), x)

有人将此称为 chol 的“错误” ,但实际上它是底层LAPACK例程的一个特性 dpstrf .分解继续进行,直到第一个对角线元素低于容差,在退出时留下尾随矩阵。

感谢 Ian 的以下观察:

您可以在 Q[-(1:r): -(1:r)] <- 0 中使用 R 的负索引跳过 if陈述。

关于r - 正半定矩阵Cholesky分解中pivot的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121059/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com