Минимальное расстояние между выбранной точкой и оставшимися точками в R? - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу построить алгоритм 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)
...