计算循环外的GP相关矩阵

时间:2013-08-16 16:52:21

标签: r correlation gaussian

所以我试图使用R来计算与高斯过程相关的相关矩阵,并希望在不使用我在下面写的三重for循环的情况下这样做的一些建议。主要是我想尝试压缩代码以实现可读目的,并加快计算速度。

#Example Data
n = 500
x1 = sample(1:100,n,replace=T)
x2 = sample(1:100,n,replace=T)
x3 = sample(1:100,n,replace=T)


X = cbind(x1,x2,x3)


R = matrix(NA,nrow=n,ncol=n)

for(i in 1:nrow(X)){
    for(j in 1:nrow(X)){
        temp = 0
        for(k in 1:ncol(X)){
            temp = -abs(X[i,k]-X[j,k])^1.99 + temp
        }
        R[i,j] = exp(temp)
    }
}

因此当n变大时,代码变得更慢。另外值得注意的是,由于这是一个相关矩阵,矩阵是对称的,对角线等于1.

2 个答案:

答案 0 :(得分:2)

使用它会快得多:

y <- t(X)

R <- exp(-sapply(1:ncol(y), function(i) colSums((y-y[,i])^2)))

如果您想保留原始配方:

R <- exp(-sapply(1:ncol(y), function(i) colSums(abs(y-y[,i])^1.99)))

答案 1 :(得分:1)

我想知道你是否可以通过更改这两行来减少计算和循环次数? (实际上时间提高了50%以上14.304秒提高到了6.234秒)

   1: for(j in 1:nrow(X)){ 
   2:    R[i,j] = exp(temp)

要:

   1: for(j in i:nrow(X)){ 
   2:    R[i,j] = R[j,i]= exp(temp)

经过测试:

> all.equal(R, R2)
[1] TRUE

这样你就可以在不进行任何计算的情况下填充下三角形.BTW,1.99是什么?这可能是一个更适合作为C程序提交的问题。 Rcpp包支持这一点,在SO上有很多有用的例子。也许搜索:[r] rcpp嵌套循环