【问题标题】:k-means return value in RR中的k均值返回值
【发布时间】:2012-01-28 01:50:54
【问题描述】:

我在 R 中使用 kmeans() 函数,我很好奇返回对象的 totsstot.withinss 属性之间有什么区别。从文档来看,它们似乎返回了相同的东西,但在我的数据集上应用 totss 的值为 66213.63,tot.withinss 的值为 6893.50。 如果您熟悉 mroe 详细信息,请告诉我。 谢谢!

马吕斯。

【问题讨论】:

    标签: r k-means least-squares


    【解决方案1】:

    给定平方和 betweenss 之间的平方和以及每个簇 withinss 平方和之内的向量,公式如下:

    totss = tot.withinss + betweenss
    tot.withinss = sum(withinss)
    

    例如,如果只有一个集群,那么betweenss 将是0,那么withinsstotss = tot.withinss = withinss 中将只有一个组件。

    为了进一步澄清,我们可以在给定集群分配的情况下自己计算这些不同的数量,这可能有助于澄清它们的含义。考虑help(kmeans) 示例中的数据x 和集群分配cl$cluster。定义平方和函数如下 - 这从该列中减去 x 的每一列的平均值,然后是剩余矩阵的每个元素的平方和:

    # or ss <- function(x) sum(apply(x, 2, function(x) x - mean(x))^2)
    ss <- function(x) sum(scale(x, scale = FALSE)^2)
    

    然后我们有以下内容。请注意,cl$centers[cl$cluster, ] 是拟合值,即它是一个矩阵,每个点有一行,因此第 i 行是第 i 个点所属的簇的中心。

    example(kmeans) # create x and cl
    
    betweenss <- ss(cl$centers[cl$cluster,]) # or ss(fitted(cl))
    
    withinss <- sapply(split(as.data.frame(x), cl$cluster), ss)
    tot.withinss <- sum(withinss) # or  resid <- x - fitted(cl); ss(resid)
    
    totss <- ss(x) # or tot.withinss + betweenss
    
    cat("totss:", totss, "tot.withinss:", tot.withinss, 
      "betweenss:", betweenss, "\n")
    
    # compare above to:
    
    str(cl)
    

    编辑:

    自从回答了这个问题以来,R 已经添加了额外的类似 kmeans 示例 (example(kmeans)) 和一个新的 fitted.kmeans 方法,我们现在在代码行后面的 cmets 中展示拟合方法如何适应上述内容。

    【讨论】:

    • 嗯。所以 tot.withinss 应该是集群内的总变化,而 totss 应该是整体数据变化。集群内的总变异 + 集群中心的 ss。对吗?
    • 我已经添加了一些进一步的说明。
    • 因此,如果想找出簇内变异的总数,那么 tot.whitinss 就是其中之一。谢谢。
    • 也就是说 between_SS / total_SS (%) 越高,聚类效果越好??不是吗??
    • @ToNoY,对。试试kmeans(rep(1:2, 4), 2) 看看完美契合。
    【解决方案2】:

    我认为您在文档中发现了一个错误......它说:

    withinss     The within-cluster sum of squares for each cluster.
    totss        The total within-cluster sum of squares.
    tot.withinss     Total within-cluster sum of squares, i.e., sum(withinss).
    

    如果您使用帮助页面示例中的示例数据集:

    > kmeans(x,2)$tot.withinss
    [1] 15.49669
    > kmeans(x,2)$totss
    [1] 65.92628
    > kmeans(x,2)$withinss
    [1] 7.450607 8.046079
    

    我认为应该有人向 r-devel 邮件列表写一个请求,要求修改帮助页面。如果你不愿意,我愿意这样做。

    【讨论】:

    • 感谢您的快速反应。我也是这么想的..文档中有错误..不幸的是,我看到的不是唯一一个。如果您想向他们提出请求,您可以写信。要点是我也在使用遗传 k-means 算法,我想比较结果。现在我不知道应该考虑哪个..
    • 用哪一个做什么? (代词和形容词太多,在你的混淆陈述或我的反问中都没有足够的名词。)
    • :/ 如果不涉及编程语言语法,你会选择语法吗?我想将遗传 k-means 算法的结果与 R 中的 kmeans 函数的结果进行比较。主要的一点是尽量减少集群内的变化。 R 中返回的 kmeans 对象有 2 个在文档中定义相同的属性。只有一个结果要比较。
    • 语义,而不是语法。我(甚至还)无法弄清楚你想要做什么样的比较。我怎么知道“遗传 k 均值”函数(无论它可能被实现)返回了什么?
    • 呵呵呵呵.. 我确定你会说语义 :] 那么这个想法是 kmeans 算法是一个优化问题。遗传算法在这个领域有相当大的适用性,适应度函数(在这种情况下)是基于平方和的集群内总变异的最小化。因此,遗传算法也返回集群内变化的总数,但 R 函数返回的 kmeans 对象有两个属性,它们应该提供相同的特性。我不知道这两者中哪一个是可以与我的结果进行比较的正确的。
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 2019-11-03
    • 2017-08-10
    • 1970-01-01
    • 2017-12-09
    • 2017-02-15
    • 2018-08-29
    • 2012-06-19
    相关资源
    最近更新 更多