回答:
kmeans結果のBICを計算するために、以下の方法をテストしました。
上記の式のrコードは次のとおりです。
k3 <- kmeans(mt,3)
intra.mean <- mean(k3$within)
k10 <- kmeans(mt,10)
centers <- k10$centers
BIC <- function(mt,cls,intra.mean,centers){
x.centers <- apply(centers,2,function(y){
as.numeric(y)[cls]
})
sum1 <- sum(((mt-x.centers)/intra.mean)**2)
sum1 + NCOL(mt)*length(unique(cls))*log(NROW(mt))
}
#
問題は、上記のrコードを使用すると、計算されたBICが単調増加していたことです。どういう理由ですか?
[ref2]ラムジー、SA、等。(2008)。「モチーフスキャンと発現ダイナミクスからの証拠を統合することにより、マクロファージ転写プログラムを明らかにする。」PLoS Comput Biol 4(3):e1000021。
私は/programming/15839774/how-to-calculate-bic-for-k-means-clustering-in-rからの新しい式を使用しました
BIC2 <- function(fit){
m = ncol(fit$centers)
n = length(fit$cluster)
k = nrow(fit$centers)
D = fit$tot.withinss
return(data.frame(AIC = D + 2*m*k,
BIC = D + log(n)*m*k))
}
この方法では、クラスター番号155で最小のBIC値が得られました。
@ttnphnsが提供するメソッドを使用して、対応するRコードを以下にリストします。しかし、問題はVcとVの違いは何ですか?また、長さが異なる2つのベクトルの要素ごとの乗算を計算する方法は?
BIC3 <- function(fit,mt){
Nc <- as.matrix(as.numeric(table(fit$cluster)),nc=1)
Vc <- apply(mt,2,function(x){
tapply(x,fit$cluster,var)
})
V <- matrix(rep(apply(mt,2,function(x){
var(x)
}),length(Nc)),byrow=TRUE,nrow=length(Nc))
LL = -Nc * colSums( log(Vc + V)/2 ) ##how to calculate this? elementa-wise multiplication for two vectors with different length?
BIC = -2 * rowSums(LL) + 2*K*P * log(NRoW(mt))
return(BIC)
}
Vc
P x Kマトリックスであると述べられてV
おり、同じサイズのマトリックスにK回伝搬された列でした。したがって、(私の答えのポイント4)を追加できVc+V
ます。次に、対数を取り、2で割り、列の合計を計算します。結果の行ベクトルは、rowと(値ごとに、つまり要素ごとに)乗算されますNc
。
私はRを使用していませんが、ここに、任意のクラスタリングソリューションのBICまたはAICクラスタリング基準の値を計算するのに役立つスケジュールを示します。
このアプローチは、SPSSアルゴリズムの2段階のクラスター分析に従います(「クラスターの数」の章から始まり、そこで「対数尤度距離」に移動して、対数尤度ksiが定義されている式を参照してください)。BIC(またはAIC)は、対数尤度距離に基づいて計算されています。定量データのみの計算を以下に示します(SPSSドキュメントで指定された式はより一般的で、カテゴリカルデータも組み込んでいます。定量データの「部分」のみを説明しています)。
X is data matrix, N objects x P quantitative variables.
Y is column of length N designating cluster membership; clusters 1, 2,..., K.
1. Compute 1 x K row Nc showing number of objects in each cluster.
2. Compute P x K matrix Vc containing variances by clusters.
Use denominator "n", not "n-1", to compute those, because there may be clusters with just one object.
3. Compute P x 1 column containing variances for the whole sample. Use "n-1" denominator.
Then propagate the column to get P x K matrix V.
4. Compute log-likelihood LL, 1 x K row. LL = -Nc &* csum( ln(Vc + V)/2 ),
where "&*" means usual, elementwise multiplication;
"csum" means sum of elements within columns.
5. Compute BIC value. BIC = -2 * rsum(LL) + 2*K*P * ln(N),
where "rsum" means sum of elements within row.
6. Also could compute AIC value. AIC = -2 * rsum(LL) + 4*K*P
Note: By default SPSS TwoStep cluster procedure standardizes all
quantitative variables, therefore V consists of just 1s, it is constant 1.
V serves simply as an insurance against ln(0) case.
AICおよびBICクラスタリング基準は、K平均クラスタリングだけでなく使用されます。これらは、クラスター内密度をクラスター内分散として扱う任意のクラスター化方法に役立ちます。AICとBICは「過剰なパラメーター」に対してペナルティを課すため、クラスターが少ないソリューションを優先する傾向があります。「クラスターが互いにより分離されていないこと」が彼らのモットーかもしれません。
BIC / AICクラスタリング基準にはさまざまなバージョンがあります。ここで示したものはVc
、クラスター内分散を対数尤度の主要な用語として使用しています。他のバージョンは、おそらくk平均クラスタリングに適しているかもしれませんが、対数尤度はクラスター内の二乗和に基づいている可能性があります。
私が参照した同じSPSSドキュメントのPDFバージョン。
そして最後に、上記の擬似コードとドキュメントに対応する数式自体があります。これは、私がSPSSユーザー向けに作成した関数(マクロ)の説明から引用したものです。数式を改善するための提案がある場合は、コメントまたは回答を投稿してください。