R中的k均值返回值
Posted
技术标签:
【中文标题】R中的k均值返回值【英文标题】:k-means return value in R 【发布时间】:2012-01-28 01:50:54 【问题描述】:我在 R 中使用 kmeans() 函数,我很好奇返回对象的 totss 和 tot.withinss 属性之间有什么区别。从文档来看,它们似乎返回了相同的东西,但在我的数据集上应用 totss 的值为 66213.63,tot.withinss 的值为 6893.50。 如果您熟悉 mroe 详细信息,请告诉我。 谢谢!
马吕斯。
【问题讨论】:
【参考方案1】:给定平方和 betweenss
之间的平方和以及每个簇 withinss
平方和之内的向量,公式如下:
totss = tot.withinss + betweenss
tot.withinss = sum(withinss)
例如,如果只有一个集群,那么betweenss
将是0
,那么withinss
和totss = 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均值返回值的主要内容,如果未能解决你的问题,请参考以下文章