R:k-最近邻分类

时间:2013-12-18 11:43:03

标签: r nearest-neighbor knn

我正在尝试使用k最近邻分类在两个组中的公告("call for")和讨论("discussions")上拆分一些电子邮件。我想这可以使用

完成
knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)

我已经有了文档术语矩阵mails。我不知道如何使用此文档术语矩阵构建traintest矩阵和cl因子。我找不到任何好的例子,也不理解http://stat.ethz.ch/R-manual/R-devel/library/class/html/knn.html上的例子。有没有人可以指出我正确的方向?

UPD

整个TermDocumentMatrix位于dl.dropboxusercontent.com/u/20641416/data

1 个答案:

答案 0 :(得分:2)

好吧,我无法解决您的问题,因为我没有样本数据。但是,我可以为您阐明文档中的示例,以便您可以了解正在发生的事情。

  • train 是“基准”数据,其分类已为人所知。它将用于形成knn结构,这将允许您进行未来的预测。

  • cl 是训练数据集的正确答案。

这里使用内置数据集iris来模拟“已知数据”。采集火车数据集,使每个物种的数量相等(s - Setosa,c - Versicolor,v - Virginica)。

train <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3]) 
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))
  • 测试是您尝试分类的数据集。给定现有(训练的)knn结构,逐行分析测试观察,并生成预测。

相同的数据集用于构建测试数据。当然,我们知道这里的真正分类,但我们假装没有。真正的分类与以前相同;它不能被knn使用:因为knn这个信息不可用。我们存储这些数据是为了估计我们的预测。

test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
cl.test <- cl

最后,我们准备继续。这是测试数据集的预测向量。如果prob = TRUE,我们还会看到算法对每种情况的“自信”:

pr.test <- knn(train, test, cl, k = 3, prob=TRUE)
 [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c v c c c c c v c c c c c c c c c c
[45] c c c c c c v c c v v v v v c v v v v c v v v v v v v v v v v
attr(,"prob")
 [1] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
 [9] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[17] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[25] 1.0000000 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000
[33] 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[41] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[49] 1.0000000 1.0000000 1.0000000 0.6666667 0.7500000 1.0000000 1.0000000 1.0000000
[57] 1.0000000 1.0000000 0.5000000 1.0000000 1.0000000 1.0000000 1.0000000 0.6666667
[65] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 0.6666667
[73] 1.0000000 1.0000000 0.6666667
Levels: c s v

我们现在可以估计我们的模型是多么正确。

sum(pr.test==cl.test)/length(cl.test)

75分中有70分,或93%正确。

有关knn如何工作的更多详细信息,请参阅统计文献。对于您的问题,请考虑交叉验证技术来调整模型。

相关问题