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

马吕斯。

最佳答案

鉴于平方和之间的平方和 betweenss 和每个集群的平方和内的向量 withinss,公式如下:

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

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

为了进一步澄清,我们可以根据集群分配自己计算这些不同的数量,这可能有助于澄清它们的含义。考虑数据 xcl$cluster 示例中的集群分配 help(kmeans) 。如下定义平方和函数——从该列中减去 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 方法,我们现在在代码行后面的注释中展示了拟合方法如何适应上述内容。

关于r - R 中的 k 均值返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8637460/

10-12 20:11