我正在尝试使用 k-nearest 将有关公告(“呼吁”
)和讨论(“讨论”
)的电子邮件分成两组邻居分类。我想这可以使用
knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)
我已经有了文档术语矩阵mails
。我不知道如何使用此文档术语矩阵构建 train
、test
矩阵和 cl
因子。我找不到任何好的例子,也不明白 http://stat.ethz.ch/R-manual/R-devel/library/class/html/knn.html 上的例子。有谁可以指出我正确的方向吗?
UPD
整个 TermDocumentMatrix 位于 dl.dropboxusercontent.com/u/20641416/data
最佳答案
好吧,我无法解决你的问题,因为我没有样本数据。不过,我可以为您澄清文档中的示例,以便您可以首先了解发生了什么。
train 是“基准”数据,其分类已知。它将用于形成 knn 结构,这将允许您做出 future 的预测。
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)))
- test 是您尝试分类的数据集。给定现有(经过训练的)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 工作原理的更多详细信息,请参阅统计文献。对于您的问题,请考虑使用交叉验证技术来调整模型。
关于R:k最近邻分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20657233/