【问题标题】:R functional programming: using apply family to calculate kernel matrix for gaussian processesR函数式编程:使用应用族计算高斯过程的核矩阵
【发布时间】:2020-04-02 22:24:40
【问题描述】:

我的最小工作示例

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

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

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

  • 矩阵X 的维度为n 乘以d
  • 矩阵Y 的维度为m 乘以d

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

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

我如何编写一段简洁的代码来执行此操作,希望使用applylapplymapply 或类似的?

愚蠢的 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, ])
    }
}

【问题讨论】:

  • apply(Y, 1, function(y) apply(X, 1, kernel_func, y))?

标签: r machine-learning functional-programming apply lapply


【解决方案1】:

这里有两种方法:

  • 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

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 2023-04-02
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多