Я хочу построить алгоритм knn, который работает следующим образом: у меня есть список векторов, и я выбираю один из них. Функция рассчитывает расстояния между выбранным вектором и оставшимися из списка. Выходными данными будет ближайший вектор к выбранной точке и соответствующее ему (минимальное) расстояние.
Сейчас у меня есть две отдельные функции. Первый вычисляет матрицу со всеми расстояниями, а второй вычисляет ближайшего соседа.
Моя цель - иметь одну функцию, которая предпочтительно использует цикл for.
a <- c(10.5, 87.6)
b <- c(24.5, 39.7)
c <- c(12.2, 20.7)
d <- c(23.53, 77.7)
e <- c(10.2, 74.40)
list1<-list(a=c(10.5, 87.6),b=c(24.5, 39.7),c=c(12.2, 20.7),d=c(23.53, 77.7),e=c(10.2, 74.40))
list2<-list(a=c(10.5, 87.6),b=c(24.5, 39.7),c=c(12.2, 20.7),d=c(23.53, 77.7),e=c(10.2, 74.40))
listEuclideanDistances <- function(list1, list2){
matrixDistances <- matrix(nrow = 5,ncol=5)
colnames(matrixDistances) <- c("a","b","c","d","e")
rownames(matrixDistances) <- c("a","b","c","d","e")
d<-0
for(i in c(1:length(list1))) {
for (j in c(1:length(list2))){
d<-0
for(z in c(1:(length(list1[[i]])) )) {
d = d + (list1[[i]][z]-list2[[j]][z])^2
}
d = sqrt(d)
print(d)
matrixDistances[i,j] <- d
}
}
return(matrixDistances)
}
distances <-listEuclideanDistances(list1,list2) #to see the values of eucledian distance
bestKnnEverMade <- function(matrixDistances, position){
minimunDistance <- 100000000 # just initializing the variable
nameOfNeighbour <- "" # just initializing the variable
columnnames <- colnames(matrixDistances)
for(i in 1:nrow(matrixDistances)){
currentValue <- matrixDistances[position,i]
if( (currentValue < minimunDistance) && (currentValue > 0) ){
minimunDistance <- currentValue
nameOfNeighbour <- columnnames[i]
}
}
return (c(nameOfNeighbour,minimunDistance))
}
bestKnnEverMade(distances,2)