如何计算测试对象与所有训练对象之间的距离

时间:2018-05-20 23:24:31

标签: r

如何计算测试对象与所有训练对象之间的距离。

然后,与其他测试对象重复此操作并自动存储它们。

我只用于一行测试集的代码。

n <- matrix( )
  for (i in 1:nrow(wdbc_train)) {
      n[i]<-sum(abs(wdbc_train[i,]-wdbc_test[1,])^2)
  }

2 个答案:

答案 0 :(得分:0)

如果你有两个矩阵,你可以像这样构建欧几里德距离矩阵(我假设数据实际上在两个矩阵的列中,但它应该很容易编辑任何配置或距离度量) :

output.matrix <- do.call(cbind,lapply(1:ncol(wdbc_train),function(i) {
    sapply(1:ncol(wdbc_test),function(j) sum((wdbc_test[,j]-wdbc_train[,i])^2))
}))

这将生成一个矩阵,其列为wdbc_train中的每个样本,以及行中每个wdbc_test列的相应距离度量。

答案 1 :(得分:0)

这是使用Iris数据子集的解决方案。

wdbc_train <- iris[1:10, -5]
wdbc_test <- iris[8:15, -5]

仅与测试数据的一行(第一行)进行比较

n <- sapply(1 : nrow(wdbc_train), function(i) sum(
       (wdbc_train[i, ] - wdbc_test[1, ])^2))
n
# [1] 0.03 0.18 0.17 0.25 0.05 0.49 0.18 0.00 0.62 0.11

现在对测试数据中的所有行重复此操作

mat <- sapply(1 : nrow(wdbc_test), function(y) 
  sapply(1 : nrow(wdbc_train), function(i) sum(
               (wdbc_train[i, ] - wdbc_test[y, ])^2)))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] 0.03 0.85 0.22 0.14 0.14 0.35 0.99 0.78
# [2,] 0.18 0.26 0.03 0.75 0.21 0.02 0.46 1.85
# [3,] 0.17 0.19 0.10 0.78 0.14 0.07 0.25 1.86
# [4,] 0.25 0.09 0.10 1.00 0.14 0.07 0.27 2.34
# [5,] 0.05 0.85 0.28 0.18 0.12 0.41 0.95 0.84
# [6,] 0.49 2.13 1.02 0.12 0.66 1.35 2.47 0.46
# [7,] 0.18 0.30 0.23 0.75 0.09 0.24 0.38 1.85
# [8,] 0.00 0.62 0.11 0.25 0.05 0.22 0.82 1.09
# [9,] 0.62 0.00 0.31 1.65 0.45 0.18 0.12 3.21
# [10,] 0.11 0.31 0.00 0.62 0.12 0.03 0.53 1.72

abs后,您不需要^2功能。