首先我要说的是,我对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
?这些问题可能过于宽泛。如果是这样,我会欢迎任何可能指向正确道路的链接。
非常可能我说过一些在这里没有意义的事情。如果是这种情况,请纠正我。
答案 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