R中的k均值返回值

Posted

技术标签:

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

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

马吕斯。

【问题讨论】:

【参考方案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 对象有两个属性,它们应该提供相同的特性。我不知道这两者中哪一个是可以与我的结果进行比较的正确的。

以上是关于R中的k均值返回值的主要内容,如果未能解决你的问题,请参考以下文章

返回 R 中矩阵的 k 个最小值的索引

尝试返回数组的最小值、最大值和平均值

计算平均值时的意外返回值?

python求一组数组最大值,最小值,平均值

R_基本统计分析_06

在同一查询中返回分组值的平均值以及该值的前 n% 的平均值?