首先让我说我对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)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
results?这些问题可能过于宽泛.如果是这样,我会欢迎任何可能指向正确道路的链接.
我很有可能在这里说了一些没有用的东西.如果是这种情况,请纠正我.
Dav*_*son 23
1)你可以得到给定行的最近邻居,如下所示:
k <- knn(train, test, labels, k = 10, algorithm="cover_tree")
indices <- attr(k, "nn.index")
Run Code Online (Sandbox Code Playgroud)
然后,如果您希望训练集中10个最近邻居的索引到第20行:
print(indices[20, ])
Run Code Online (Sandbox Code Playgroud)
(你选择了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
Run Code Online (Sandbox Code Playgroud)
这些是1000训练集中最接近测试集第20行的索引.
2)这取决于你的意思是"修改".对于初学者,您可以获得每行10个最接近标签的索引,如下所示:
closest.labels = apply(indices, 2, function(col) labels[col])
Run Code Online (Sandbox Code Playgroud)
然后,您可以看到与第20个训练点最近的10个点的标签,如下所示:
closest.labels[20, ]
# [1] 0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
这表明第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
Run Code Online (Sandbox Code Playgroud)