在 R 中计算欧氏距离的函数

Function to calculate Euclidean distance in R

我正在尝试在虹膜数据集上从头开始在 R 中实现 KNN 分类器,作为其中的一部分,我编写了一个函数来计算欧氏距离。这是我的代码。

known_data <- iris[1:15,c("Sepal.Length", "Petal.Length", "Class")]
unknown_data <- iris[16,c("Sepal.Length", "Petal.Length")]

# euclidean distance
 euclidean_dist <- function(k,unk) {
 distance <- 0
 for(i in 1:nrow(k))
 distance[i] <- sqrt((k[,1][i] - unk[,1][i])^2 + (k[,2][i] - unk[,2][i])^2)
 return(distance)
} 

euclidean_dist(known_data, unknown_data)

但是,当我调用该函数时,它会正确返回第一个值,其余为 NA。 谁能告诉我代码哪里出了问题? 提前致谢。

目的是计算第i行known_data和单个unknown_data点之间的距离

如何修复代码

当您计算 distance[i] 时,您正在尝试访问未知数据点的第 i 行,该数据点不存在,因此是 NA。我相信如果您进行以下编辑,您的代码应该 运行 没问题:

known_data <- iris[1:15,c("Sepal.Length", "Petal.Length", "Class")] 
unknown_data <- iris[16,c("Sepal.Length", "Petal.Length")]

# euclidean distance
euclidean_dist <- function(k,unk) {
  # Make distance a vector [although not technically required]
  distance <- rep(0, nrow(k))

  for(i in 1:nrow(k))
    # Change unk[,1][i] to unk[1,1] and similarly for unk[,2][i]
    distance[i] <- sqrt((k[,1][i] - unk[1,1])^2 + (k[,2][i] - unk[1,2])^2)

  return(distance)
} 

euclidean_dist(known_data, unknown_data)

最后一点 - 在我使用的 R 版本中,已知数据集使用 Species 而不是 Class

另一种方法

正如@Roman Luštrik 所建议的,获得欧氏距离的整个目标可以通过一个简单的单行代码实现:

sqrt((known_data[, 1] - unknown_data[, 1])^2 + (known_data[, 2] - unknown_data[, 2])^2)

这与您编写的函数非常相似,但它是以矢量化形式执行的,而不是通过循环执行的,这通常是在 R 中执行操作的首选方式。

最好最快的方法是使用 h2o 包:

#load library
    library(h2o)
#initialize the node
    h2o.init()
#transform the df to h2o type
    known_data<-as.h2o(known_data)
    unknown_data<-as.h2o(unknown_data)
#create a matrix in which the distances are going to be record
    matrix1<-h2o.createFrame(rows=nrow(known_data),cols=unknown_data)
#do a loop to calculate the distance between all the rows of both df
    for(i in 1:nrow(unknown_data)){
    matrix[,i]<-as.data.frame(h2o.distance(known_data, unknown_data[i,],"l2"))
    }