首页 > 解决方案 > R 函数式编程:使用应用族计算高斯过程的核矩阵

问题描述

我的最小工作示例

这是我的最小工作示例(注意我已经简化了数学)。假设我有两个变量的函数,其中xy是相同维度的两个向量。

kernel_func <- function(x, y){
    return(sum((x - y)^2))
}

我也有两个行数不同但列数相同的矩阵。

现在我想获得一个矩阵,称为它K,它的 i,j 元素是通过将i第 th 行X作为第一个参数传递给kernel_func并将第jth 行Y作为第二个参数来计算的。那是

kernel_func(X[i, ], Y[j, ])

我如何编写一段简洁的代码来做到这一点,希望使用,apply或类似的?lapplymapply

愚蠢的MWE

创建具有相同列数的两个矩阵

X = matrix(1:9, nrow=3, ncol=3)
Y = matrix(1:12, nrow=4, ncol=3)

用零初始化K矩阵

K <- matrix(0, nrow(X), nrow(Y))

使用双循环创建矩阵

for (i in rep(1:nrow(X), 4)){
    for (j in 1:nrow(Y)) {
        K[i, j] = kernel_func(X[i, ], Y[j, ])
    }
}

标签: rmachine-learningfunctional-programmingapplylapply

解决方案


这里有两种方法来实现它:

  • 解决方案apply()
K <- t(apply(X, 1, function(p) apply(Y, 1, function(q) kernel_func(p,q))))
  • 解决方案expand.grid()
K <- matrix(apply(expand.grid(1:nrow(X),1:nrow(Y)),1, 
                  function(k) kernel_func(X[k[1],],Y[k[2],])),nrow = nrow(X))

输出

> K
     [,1] [,2] [,3] [,4]
[1,]    5   14   29   50
[2,]    2    5   14   29
[3,]    5    2    5   14

推荐阅读