Как просмотреть ближайших соседей в R?

Позвольте мне начать с того, что у меня нет опыта работы с R, KNN или наукой о данных в целом. Недавно я нашел Kaggle и играл с Digit Recognition конкурс/учебник.

В этом уроке они приводят пример кода, чтобы начать работу с базового представления:

# makes the KNN submission

library(FNN)

train <- read.csv("c:/Development/data/digits/train.csv", header=TRUE)
test <- read.csv("c:/Development/data/digits/test.csv", header=TRUE)

labels <- train[,1]
train <- train[,-1]

results <- (0:9)[knn(train, test, labels, k = 10, algorithm="cover_tree")]

write(results, file="knn_benchmark.csv", ncolumns=1) 

Мои вопросы:

  • Как я могу просмотреть ближайших соседей, которые были выбраны для конкретная строка тестов?
  • Как я могу изменить, какой из этих десяти выбран? для моего results?

Эти вопросы могут быть слишком широкими. Если это так, я бы приветствовал любые ссылки, которые могли бы указать мне по правильной дороге.

Возможно очень, что я сказал что-то, что здесь не имеет смысла. Если это так, пожалуйста, исправьте меня.

Ответы

Ответ 1

1) Вы можете получить ближайших соседей данной строки следующим образом:

k <- knn(train, test, labels, k = 10, algorithm="cover_tree")
indices <- attr(k, "nn.index")

Затем, если вы хотите, чтобы индексы из 10 ближайших соседей пересекали 20 в обучающем наборе:

print(indices[20, ])

(Вы получите 10 ближайших соседей, потому что вы выбрали k=10). Например, если вы запускаете только первые 1000 строк набора для обучения и тестирования (чтобы сделать его проще вычислить):

train <- read.csv("train.csv", header=TRUE)[1:1000, ]
test <- read.csv("test.csv", header=TRUE)[1:1000, ]

labels <- train[,1]
train <- train[,-1]

k <- knn(train, test, labels, k = 10, algorithm="cover_tree")
indices = attr(k, "nn.index")

print(indices[20, ])
# output:
#  [1] 829 539 784 487 293 882 367 268 201 277

Это индексы в наборе обучения 1000, которые ближе всего к 20-й строке тестового набора.

2) Это зависит от того, что вы подразумеваете под "модификацией". Для начала вы можете получить индексы каждой из 10 ближайших ярлыков для каждой строки следующим образом:

closest.labels = apply(indices, 2, function(col) labels[col])

Затем вы можете увидеть метки 10 ближайших точек к 20-й точке тренировки следующим образом:

closest.labels[20, ]
# [1] 0 0 0 0 0 0 0 0 0 0

Это означает, что все 10 ближайших точек в строке 20 находятся в группе, помеченной 0. knn просто выбирает метку большинством голосов (со случайными нарушениями), но вы можете выбрать какую-то схему взвешивания если вы предпочитаете.

ETA: Если вам интересно взвешивать более близкие элементы в вашей схеме голосования, обратите внимание, что вы также можете получить расстояние до каждого из k-соседей, как это:

dists = attr(k, "nn.dist")
dists[20, ]
# output:
# [1] 1238.777 1243.581 1323.538 1398.060 1503.371 1529.660 1538.128 1609.730
# [9] 1630.910 1667.014