如何查看R中最近的邻居?

时间:2012-08-28 05:27:01

标签: r kaggle

首先我要说的是,我对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) 

我的问题是:

  1. 如何查看已为a选择的最近邻居 特别测试行?
  2. 如何修改这十个中的哪一个被选中 我的results
  3. 这些问题可能过于宽泛。如果是这样,我会欢迎任何可能指向正确道路的链接。

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

1 个答案:

答案 0 :(得分:23)

1)您可以像这样得到给定行的最近邻居:

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

然后,如果你想在训练集中第10行的10个最近邻居的索引:

print(indices[20, ])

(因为你选择了k=10,你会得到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

这表示第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