web-dev-qa-db-ja.com

Rでのk-meansクラスタリングのBICを計算する方法

Rでデータをクラスター化するためにk-meansを使用してきましたが、ベイズ情報量基準(BIC)とAICを使用して、クラスター化の適合度とモデルの複雑さを評価できるようにしたいと思います。現在、Rで使用しているコードは次のとおりです。

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

しかし、BICと対数尤度を抽出できるようにしたいと思います。どんな助けでも大歓迎です!

19
UnivStudent

BICを計算するには、.5*k*d*log(n)を追加するだけです(ここで、kは平均の数、dはデータセット内のベクトルの長さ、n標準のk-means誤差関数に対するデータポイントの数です。

標準のk-meansペナルティは\sum_n (m_k(n)-x_n)^2です。ここで、m_k(n)はn番目のデータポイントに関連付けられた平均です。このペナルティcanは対数確率として解釈されるため、BICは完全に有効です。

BICは、kに比例するk-meansエラーにペナルティ項を追加するだけです。

6
user1149913

User1149913が言ったことに追加するだけです(コメントするのに十分な評判がありません)。Rでkmeans関数を使用しているため、\sum_n (m_k(n)-x_n)^2はすでにKClData$tot.withinssとして計算されています。

3
FrankD

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パッケージの次のリリースで提供される予定です。

2
Neal Fultz