バツ1、x2、… 、xんRd私J
c私= 1| 私|Σ私∈ 私バツ私、c J= 1| J|ΣJ ∈ Jバツj
| | c私− cJ| |2D私はj= | | バツ私− xj| |2。
ANOVA計算で平方和を分解するのとまったく同じように、代数的恒等式は
| | c私− cJ| |2= 1| 私| | J|( SS(私∪ J)− (| I| + | J| )(1| 私|SS(私)+ 1| J|SS(J)))
SS、すべての点間の距離の二乗の面でこれを再表現します:
SS(K)= 12Σ私、j∈K| | バツ私− xj| |2= ∑私< j∈KD私はj。
O ((| I| + | J| )2)kO (n2/ k2)D
R
これらの計算を説明およびテストするためのコードを次に示します。
ss <- function(x) {
n <- dim(x)[2]
i <- rep(1:n, n)
j <- as.vector(t(matrix(i,n)))
d <- matrix(c(1,1) %*% (x[,i] - x[,j])^2 , n) # The distance matrix entries for `x`
sum(d[lower.tri(d)])
}
centroid <- function(x) rowMeans(x)
distance2 <- function(x,y) sum((x-y)^2)
#
# Generate two clusters randomly.
#
n.x <- 3; n.y <- 2
x <- matrix(rnorm(2*n.x), 2)
y <- matrix(rnorm(2*n.y), 2)
#
# Compare two formulae.
#
cat("Squared distance between centroids =",
distance2(centroid(x), centroid(y)),
"Equivalent value =",
(ss(cbind(x,y)) - (n.x + n.y) * (ss(x)/n.x + ss(y)/n.y)) / (n.x*n.y),
"\n")