KNN находит N лучших соседей

Примечание: изначально опубликовано в Cross Validated, но в рекомендациях говорится, что эта тема лучше подходит для этой темы.

Я использую метод knn в пакете FNN для классификации, но я хотел бы видеть N ближайших соседей, а не только самого верхнего. Я пробовал разные пакеты (например, FastKNN и knncat), но не могу найти быструю функцию, которая сделает это за вас.

Это аналогичный вопрос (за исключением части матрицы расстояний): Найти K ближайших соседей, исходя из матрицы расстояний

Вот что я пробовал: LINE содержит одну строку матрицы расстояний, LINE_N содержит N верхних соседей для каждого прогноза.

line_n = c()

  tmp_min <- order(line)[1:ncol(distance)]
  tmp_id <- c()

  for (element in tmp_min)
    tmp_id <- c(tmp_id, colnames(distance)[element])

  for (element in tmp_id){

      if (!(element %in% line_n))
        line_n<- c(line_n, element)
      if (length(line_n) == N)
        break
  }

  line_n

Мне было интересно, была ли уже реализована его оптимизированная версия или есть ли у кого-нибудь идеи о том, как сделать это быстрее.


r knn
person rdm11    schedule 06.04.2016    source источник
comment
спасибо, такого я не видел. Хотя (и я новичок в R, поэтому я могу ошибаться), я думаю, что это то, что я делаю. Этот вектор line_n я добавляю к окончательной матрице результатов, которая была объявлена ​​первой. И чтобы получить line_n, я перебираю матрицу расстояний (которую я никогда не изменяю) и обрабатываю по одной строке за раз.   -  person rdm11    schedule 06.04.2016


Ответы (1)


Вот код того, что вы ищете:

line_ret = c()
while(length(line_ret) < M)
{
  tmp = which.min(line)
  if (!(col_name[tmp] %in% line_ret))
  line_ret = c(line_ret, col_name[tmp])
  line <- line[-c(tmp)]
  col_name <- col_name[-c(tmp)]
}
line_ret
person abhi    schedule 06.04.2016