为什么从协方差矩阵的 Cholesky 分解得到的矩阵在乘以其转置时不会返回协方差矩阵?

机器算法验证 r 协方差矩阵 多元正态分布 矩阵分解 胆汁分解
2022-04-05 10:26:42

我有一个协方差矩阵 ,S我使用 Cholesky 分解来找到A据说AA'=S但是,当我恢复S时,我并没有恢复AA'R中的示例代码如下。

S <- matrix(c(1.091385, 1.949606, 1.949606, 4.520746), 2, 2)
A <- chol(S)
T <- t(A)
R <- A %*% T

可以看出,S如下。

1.091385, 1.949606
1.949606, 4.520746

但是R如下。

4.574082, 1.901370
1.901370, 1.038049

为了完整起见,A如下。

1.044694, 1.866199
0.000000, 1.018847

但是,当我A'A使用代码时R <- T %*% A,我会恢复S

关于我做错了什么的任何想法?还是维基百科上的链接错误?关于 Cholesky 分解的R 示例似乎表明A'A=S

2个回答

正如我在评论中所解释的那样,不方便的事实是,Cholesky 分解虽然通常定义为,其中(其中是上三角形)同样有效。LAPACK(我们的计算机用于计算线性代数任务的库)中的 Cholesky 分解实现允许这两种表达式。不幸的是,R 已经硬编码了上面的那个。实际计算 Cholesky的例程调用中有一个。)K=LLTLK=UTUUUdpstrf

这意味着必须转置结果chol以获得下三角矩阵。做完之后,因为你已经发现了自己,结果直接跟进。例如,给定S原始帖子的矩阵:

U <- chol(S);
L <- t(chol(S));
S -  crossprod(U) # This is equivalent to S- U^T*U and should be approx. 0
S - tcrossprod(L) # This is equivalent to S- L*L^T and should be approx. 0

我希望因此很清楚维基百科页面没有错。有点批评,维基百科的Cholesky 分解文章可能应该提到 Cholesky 分解等效于 where为了符号的一致性,它可能被省略了。K=LLTK=UTUU=LT

那么,为什么你认为 chol(S) 返回你的 A 而不是 A'?

事实上,如果您查看值或阅读文档,它确实会返回 A' 。它返回上三角形,对应于您的 Wiki 参考中的 A'