【问题标题】:R: k-nearest neighbours classificationR:k-最近邻分类
【发布时间】:2013-12-18 11:43:03
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: r nearest-neighbor knn


    【解决方案1】:

    好吧,我无法解决您的问题,因为我没有样本数据。不过,我可以为您澄清文档中的示例,这样您就可以先了解发生了什么。

    • 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)))
    
    • 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 工作原理的更多详细信息,请参阅统计文献。对于您的问题,请考虑使用交叉验证技术来调整模型。

    【讨论】:

    • 我明白了!感谢那。在我的例子中,iris3 是一个 TermDocumentMatrix,我真的不知道如何使用这个矩阵构建训练和测试集。我确实设法使用正则表达式构造了cl
    • 通过 dput() 共享一小部分数据,以了解数据的外观。
    • 我想使用的部分 TermDocumentMatrix 可以在pastebin.com/VpAt35bS找到。
    • 不可读:nrow = 13880L, ncol = 537L 表示你 dput() 整个对象,这是巨大的。应在输入前应用子集。使用 df 检查是否可以加载回 R.
    • 确实很大。整个 TermDocumentMatrix 位于dl.dropboxusercontent.com/u/20641416/data
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 2011-06-23
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多