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

Uni*_*ent 19 r cluster-analysis k-means

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

KClData <- kmeans(Data, centers=2, nstart= 100)
Run Code Online (Sandbox Code Playgroud)

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

And*_*ton 15

对于任何人登陆这里,有一个在提出雪利酒塔的方法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)
}
Run Code Online (Sandbox Code Playgroud)

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

return(data.frame(AIC = D + 2*m*k,
                  BIC = D + log(n)*m*k))
Run Code Online (Sandbox Code Playgroud)

所以你会使用如下:

fit <- kmeans(x = data,centers = 6)
kmeansAIC(fit)
Run Code Online (Sandbox Code Playgroud)


use*_*913 7

为了计算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.