如何计算R中k-means聚类的BIC

时间:2013-04-05 17:19:16

标签: r cluster-analysis k-means

我一直在使用k-means在R中聚类我的数据,但我希望能够使用Baysiean信息准则(BIC)和AIC评估我的聚类的拟合与模型的复杂性。目前我在R中使用的代码是:

KClData <- kmeans(Data, centers=2, nstart= 100)

但我希望能够提取BIC和Log Likelihood。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:15)

对于任何登陆这里的人来说,Sherry Towers在http://sherrytowers.com/2013/10/24/k-means-clustering/提出了一种使用stats::kmeans输出的方法。我引用:

  

可以使用以下功能计算AIC:

kmeansAIC = function(fit){

m = ncol(fit$centers)
n = length(fit$cluster)
k = nrow(fit$centers)
D = fit$tot.withinss
return(D + 2*m*k)
}

stats::AIC的帮助中,您还可以看到BIC的计算方式与AIC类似。获取BIC的一种简单方法是用以下代码替换上述函数中的return()

return(data.frame(AIC = D + 2*m*k,
                  BIC = D + log(n)*m*k))

所以你会按如下方式使用它:

fit <- kmeans(x = data,centers = 6)
kmeansAIC(fit)

答案 1 :(得分:6)

要计算BIC,只需添加.5*k*d*log(n)(其中k是平均值,d是数据集中矢量的长度,n是标准k均值误差函数的数据点数。

标准k均值惩罚为\sum_n (m_k(n)-x_n)^2,其中m_k(n)是与第n个数据点关联的平均值。此惩罚可以被解释为对数概率,因此BIC完全有效。

BIC只是为与k成比例的k均值误差添加了额外的惩罚项。

答案 2 :(得分:3)

只是添加到user1149913所说的内容(我没有足够的声誉来评论),因为您在R中使用了kmeans功能,\sum_n (m_k(n)-x_n)^2已经为您计算KClData$tot.withinss 1}}。

答案 3 :(得分:2)

我们可以为AIC个对象定义对数似然函数,而不是重新实现BICkmeans;然后,这将由BIC包中的stats函数使用。

logLik.kmeans <- function(object) structure(
  -object$tot.withinss/2,
  df = nrow(object$centers)*ncol(object$centers),
  nobs = length(object$cluster)
)

然后使用它,正常呼叫BIC。例如:

example(kmeans, local=FALSE)
BIC(cl)
# [1] 26.22842084

此方法将在stackoverflow包的下一版本中提供。