在 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"))
}
我正在尝试在虹膜数据集上从头开始在 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"))
}