Rでデータをクラスター化するためにk-meansを使用してきましたが、ベイズ情報量基準(BIC)とAICを使用して、クラスター化の適合度とモデルの複雑さを評価できるようにしたいと思います。現在、Rで使用しているコードは次のとおりです。
KClData <- kmeans(Data, centers=2, nstart= 100)
しかし、BICと対数尤度を抽出できるようにしたいと思います。どんな助けでも大歓迎です!
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エラーにペナルティ項を追加するだけです。
User1149913が言ったことに追加するだけです(コメントするのに十分な評判がありません)。Rでkmeans関数を使用しているため、\sum_n (m_k(n)-x_n)^2
はすでにKClData$tot.withinss
として計算されています。
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
パッケージの次のリリースで提供される予定です。