R:更快地确定每行的k最近邻居,将其他元素设置为零并对其进行标准化

时间:2015-03-18 00:51:00

标签: r data.table

我想为each row矩阵确定k最近邻,这是我的代码,我认为data.table可以更有效率,但目前,我无法弄明白

mm <- matrix(c(5, 1, 2, 3, 5, 4), 3, 2)
mm <- tcrossprod(mm)
getNearest <- function(simmat, k = 2) {
    res <- apply(simmat, 1, function(x) {
        s <- sort(x, index.return = TRUE)
        x[s$ix[1:(length(x) - k)]] <- 0
        return(x)
      }  
    )
   return(res / rowSums(res))
}
getNearest(mm, k = 2)

> getNearest(mm, k = 2)
      [,1]      [,2]      [,3]
[1,] 0.6071429 0.0000000 0.3928571
[2,] 0.0000000 0.5416667 0.4583333
[3,] 0.5000000 0.5000000 0.0000000

原来的mm是:

> mm
     [,1] [,2] [,3]
[1,]   34   20   22
[2,]   20   26   22
[3,]   22   22   20

对于2000乘2000矩阵和k = 30,它将花费1.17秒,是否有更有效的方法来完成相同的事情,在data.table

感谢。

0 个答案:

没有答案