Ответ 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