Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较R中的矩阵求逆-Cholesky方法有什么错?_R_Matrix_Matrix Inverse - Fatal编程技术网

比较R中的矩阵求逆-Cholesky方法有什么错?

比较R中的矩阵求逆-Cholesky方法有什么错?,r,matrix,matrix-inverse,R,Matrix,Matrix Inverse,我比较了各种方法来计算对称矩阵的逆: 从LAPCK包中求解 解决,但使用更高的机器精度 据说qr.solve速度更快 ginv质量包,Moore-Penrose算法的实现 Cholesky分解的chol2inv 通过特征值比较逆矩阵: R library(MASS) ## Create the matrix m = replicate(10, runif(n=10)) m[lower.tri(m)] = t(m)[lower.tri(m)] ## Inverse the matrix in

我比较了各种方法来计算对称矩阵的逆:

从LAPCK包中求解 解决,但使用更高的机器精度 据说qr.solve速度更快 ginv质量包,Moore-Penrose算法的实现 Cholesky分解的chol2inv 通过特征值比较逆矩阵:

R
library(MASS)

## Create the matrix
m = replicate(10, runif(n=10)) 
m[lower.tri(m)] = t(m)[lower.tri(m)]

## Inverse the matrix
inv1 = solve(m)
inv2 = solve(m, tol = .Machine$double.eps)
inv3 = qr.solve(m)
inv4 = ginv(m)
inv5 = chol2inv(m)

## Eigenvalues of the inverse
em1=eigen(inv1)
em2=eigen(inv2)
em3=eigen(inv3)
em4=eigen(inv4)
em5=eigen(inv5)

## Plot the abs of the eigenvalues (may be complex)
myPch=c( 20, 15, 17, 25, 3 )
plot(abs(em1$values),pch=myPch[1],cex=1.5)
points(abs(em2$values),pch=myPch[2], cex=1.5)
points(abs(em3$values),pch=myPch[3], cex=1.5)
points(abs(em4$values),pch=myPch[4], cex=1.5)
points(abs(em5$values),pch=myPch[5], cex=1.5)
legend( "topright", c("solve","solve-double","solve-fast","Moore-Penrose","Cholesky"), pch=myPch )
正如你所看到的,Cholesky方法给出的逆解与其他方法明显不同

根据这篇文章,如果矩阵在我们的例子中是对称的,那么最好使用Cholesky方法:

但作为官方的推广R方法,我可能会误解一些东西

有好的小费吗


提前感谢,

您需要将Cholesky分解传递给chol2inv:


如果m是正定的,这可能不是因为您的不可复制输入,这将给出与其他方法相同的结果。

您的示例不可复制,因为您没有设置随机种子。但是,检查矩阵是否为正定矩阵。另外,一般的建议是避免倒置矩阵。当然,它应该是inv5=CHOL2INVCOLM。@Roland Nittling;一般建议是避免显式反转矩阵。使用分解通常是避免对原始矩阵进行显式求逆的一种方法。@Roland&如果按照您的建议执行chol2invcholm,对于我刚才运行的随机示例,R声明:chol中的错误。defaultm:3阶的前导小调不是正定的,因此突出了OP面临的问题+一个可怜人的方法来改进我的代码,使矩阵是正定的和对称的:librarycaper;t=rtreen=10;m=vcv t
inv5 = chol2inv(chol(m))