首页 > 解决方案 > 在R中的knn中实现距离矩阵

问题描述

我想计算 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()
  }

}

标签: rmatrixapplyknn

解决方案


考虑mapply和的expand.grid所有组合:MN

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

推荐阅读