我一直在使用k-means在R中聚类我的数据,但我希望能够使用Baysiean信息准则(BIC)和AIC评估我的聚类的拟合与模型的复杂性。目前我在R中使用的代码是:
KClData <- kmeans(Data, centers=2, nstart= 100)
但我希望能够提取BIC和Log Likelihood。任何帮助将不胜感激!
答案 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
个对象定义对数似然函数,而不是重新实现BIC
或kmeans
;然后,这将由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
包的下一版本中提供。