Как работает взвешивание расстояний в КНН? - PullRequest
1 голос
/ 22 июня 2019

Я пишу классификатор KNN в R. Я хочу добавить весовую схему, например, инвертированные индексы 1 / d.На самом деле, для набора данных Iris я получаю почти идеальную точность 66% (независимо от используемой метрики), поскольку значение нет.3 ("virginica") почти никогда не появляется, и я хочу улучшить его с помощью взвешивания.У меня вопрос: что именно и как мне весить?Я читал, что мне следует взвешивать классы K ближайших соседей с этими расстояниями.

Я пытался создать векторы классов и расстояний до K ближайших соседей, а затем взять из них взвешенное среднее значение:

inverted <- function(vals, distances)
{
  inv_distances <- 1 / distances
  # eliminate division-by-zero errors
  inv_distances <- ifelse((inv_distances < 0.01), 0.01, inv_distances)

  weighted.mean(vals, inv_distances)
}

Мои результаты странные: для правильных векторов vals (классов) и расстояний я иногда получаю значения NaN (не число) или NA.Кроме того, мои веса не составляют 1, и ... они, вероятно, должны?Я не уверен.Мне просто нужен кто-то, чтобы очистить эту схему взвешивания для меня.

РЕДАКТИРОВАТЬ: Я отлаживал выше код, так как он слишком поздно умножается на вес (поэтому не устраняет расстояние 0 и не вызывает NaNs),Я также изменил его на весы серии гармоник, не используя расстояние (поэтому первый сосед имеет вес 1, второй 1/2, третий 1/3 и т. Д.).Я до сих пор не знаю точно, как это работает и какие могут быть другие веса.

inverted <- function(vals)
{
  weights <- 1 / seq(length(vals))

  res <- weighted.mean(vals, weights)
  res
}
...