15

首先让我说我一般没有 R、KNN 或数据科学方面的经验。我最近发现了Kaggle,并且一直在玩数字识别竞赛/教程。

在本教程中,他们提供了一些示例代码来帮助您开始基本提交:

# 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) 

我的问题是:

  1. 如何查看为特定测试行选择的最近邻居?
  2. 如何修改为我选择的这十个中的哪一个results

这些问题可能过于宽泛。如果是这样,我会欢迎任何可以为我指明正确道路的链接。

可能在这里说了一些没有意义的话。如果是这种情况,请纠正我。

4

1 回答 1

23

1)您可以获得给定行的最近邻居,如下所示:

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

然后,如果您希望训练集中第 20 行的 10 个最近邻居的索引:

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])

然后,您可以看到距离第 20 个训练点最近的 10 个点的标签,如下所示:

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

这表明最接近第 20 行的所有 10 个点都在标记为 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
于 2012-08-28T06:03:41.197 回答