如何计算R中接近奇异矩阵的逆?

时间:2013-11-20 00:34:23

标签: r matrix inverse singular

我希望最小化函数FlogV(使用多正态分布,Z是数据矩阵NxC; SI​​GMA是数据的var协方差的方矩阵CxC,R是长度为C的向量)

FLogV <- function(P){

(here I define parameters, P, within R and SIGMA)

logC <- (C/2)*N*log(2*pi)+(1/2)*N*log(det(SIGMA))

SOMA.t <- 0

for (j in 1:N){
SOMA.t <- SOMA.t+sum(t(Z[j,]-R)%*%solve(SIGMA)%*%(Z[j,]-R))
}

MlogV <- logC + (1/2)*SOMA.t

return(MlogV)

}

minLogV <- optim(P,FLogV)

所有这些都是扩展代码的一部分,已经过测试并运行良好,除了最重要的事情:我无法优化,因为我收到此错误: “solve.default(SIGMA)中的错误:   系统是计算奇异的:倒数条件数= 3.57726e-55“

如果我使用ginv()或pseudoinverse()或qr.solve(),我得到: “svd(X)中的错误:'x'中的无限或缺失值

问题是:如果我在错误消息之后采用SIGMA矩阵,我可以求解(SIGMA),特征值都是正的,行列式很小但是正     DET(SIGMA)     [1] 3.384674e-76

eigen(SIGMA)$values
[1] 0.066490265 0.024034173 0.018738777 0.015718562 0.013568884 0.013086845
….
[31] 0.002414433 0.002061556 0.001795105 0.001607811

我已经阅读了几篇关于变换矩阵的文章,如SIGMA(接近奇异),在数据规模和形式上进行了几次转换,但我意识到,对于像示例这样的34x34矩阵,在det(SIGMA)接近e之后-40,R假设为0,计算失败;我也不能减少矩阵尺寸,也不能在我的函数校正算法中输入奇异矩阵,因为R不能用它来优化这个优化函数来评估它。我真的很感激对这个问题的任何建议。 提前致谢, 玛丽亚D.

1 个答案:

答案 0 :(得分:0)

您的帖子中不清楚失败是来自det()还是solve()

如果它只是二次项中的求解,你可能想尝试solve的两个参数版本,它可以更稳定一点。 solve(X,Y)solve(X) %*% Y

相同

如果您可以使用chol()对sigma进行因子分析,您将获得一个三角矩阵,使得LL'= Sigma。行列式是对角线的乘积,您可以尝试使用二次项:

crossprod( backsolve(L, Z[j,]-R))