在 R 中的 knn 中实现距离矩阵

Implement distance matrix in knn in R

我想计算R中的距离矩阵(使用欧氏距离)

我知道如何在 for 循环中做到这一点

但是我如何使用应用族函数来做到这一点?

require(magrittr)

data(iris)

set.seed(1)
data <- iris[sample(nrow(iris))   ,] # 打散資料
Xtrain <- data[1:100,1:4]
Xtest <- data[101:150,1:4]

M <- nrow(Xtrain)
N <- nrow(Xtest)

distmatrix <- matrix(0,nrow = M,ncol = N)

for(i in 1:M){
  for(j in 1:N){
    distmatrix[i,j]<- sum((Xtrain[i,]-Xtest[j,])^2) %>% sqrt()
  }

}

对于 MN 的所有组合,考虑 mapplyexpand.grid

params <- expand.grid(M=seq(M), N=seq(N))

distmatrix2 <- matrix(mapply(function(i,j) sqrt(sum((Xtrain[i,]-Xtest[j,])^2)), 
                      params$M, params$N),
                      nrow = M, ncol = N)

# EQUIVALENT TO OP's distance 
identical(distmatrix, distmatrix2)
# TRUE