如何计算测试对象与所有训练对象之间的距离。
然后,与其他测试对象重复此操作并自动存储它们。
我只用于一行测试集的代码。
n <- matrix( )
for (i in 1:nrow(wdbc_train)) {
n[i]<-sum(abs(wdbc_train[i,]-wdbc_test[1,])^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
功能。