Cara yang efisien untuk menghitung jarak antara centroid dari matriks jarak

8

Mari kita memiliki matriks simetris kuadrat dari jarak euclide kuadrat antara titik dan vektor memanjang menunjukkan keanggotaan kelompok atau klaster ( k cluster) dari titik-titik tersebut; sebuah cluster dapat terdiri dari \ ge1 point.Dnnk1

Apa cara yang paling efisien atau sangat efisien (dalam hal kecepatan) untuk menghitung jarak antara cluster centroid di sini?

Sejauh ini saya selalu melakukan analisis Koordinator Kepala Sekolah dalam situasi ini. PCoA, atau MDS Torgerson merupakan jumlah pertama yang mengkonversi D ke dalam matriks produk skalar S ("pemusatan ganda") dan kemudian melakukan PCA untuknya. Dengan cara ini kita membuat koordinat untuk n poin dalam ruang euclidean yang direntangkan. Setelah itu, mudah untuk menghitung jarak antara centroid dengan cara biasa - seperti yang Anda lakukan dengan grouped points x variablesdata. PCoA hubungannya eigen-dekomposisi atau SVD dari n x nsimetris positif semidefinite S , tapi nbisa sangat besar. Selain itu, tugasnya bukan pengurangan dimensi dan kita tidak benar-benar membutuhkan sumbu utama ortogonal itu. Jadi saya punya perasaan bahwa dekomposisi ini mungkin berlebihan.

Jadi, apakah Anda memiliki pengetahuan atau ide tentang cara yang berpotensi lebih cepat?

ttnphns
sumber

Jawaban:

6

Biarkan poin diindeks , semuanya dalam . Biarkan menjadi indeks untuk satu cluster dan indeks untuk cluster lain. Centroid adalahx1,x2,...,xnRdsayaJ

csaya=1|saya|sayasayaxsaya, cJ=1|J|jJxj

dan diinginkan untuk menemukan jarak dalam hal jarak kuadrat .||csaya-cJ||2Dsayaj=||xsaya-xj||2

Persis seperti kita akan memecah jumlah kuadrat dalam perhitungan ANOVA, identitas aljabar adalah

||csaya-cJ||2=1|saya||J|(SS(sayaJ)-(|saya|+|J|)(1|saya|SS(saya)+1|J|SS(J)))

di mana " " mengacu pada jumlah kuadrat jarak antara setiap titik dalam satu set dan centroid mereka. The identitas polarisasi kembali mengungkapkan ini dalam hal jarak kuadrat antara semua titik:SS

SS(K)=12saya,jK||xsaya-xj||2=saya<jKDsayaj.

Oleh karena itu upaya komputasi adalah , dengan konstanta implisit yang sangat kecil. Ketika cluster kira-kira berukuran sama dan ada di antaranya, ini adalah , yang berbanding lurus dengan jumlah entri dalam : itu akan menjadi yang terbaik yang bisa diharapkan.HAI((|saya|+|J|)2)kHAI(n2/k2)D


R kode untuk menggambarkan dan menguji perhitungan berikut ini.

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")
whuber
sumber
Sempurna! Saya harus mengakui bahwa saya tahu identitas jajaran genjang. Saya sendiri tidak dapat melihat dengan jelas tautan ke tugas saya dan menyimpulkan rumusnya. Terima kasih banyak untukmu. Saya sudah memprogram fungsi (dalam SPSS) berdasarkan rumus Anda untuk sejumlah centroid dan memang lebih cepat dengan matriks D yang besar daripada cara tidak langsung melalui PCoA.
ttnphns
Saya juga menambahkan bahwa rumus tetap valid jika grup / cluster berpotongan oleh komposisi objek.
ttnphns
Ya, itu benar: identitas yang saya gunakan tidak menganggap kluster-kluster itu terpisah.
whuber
Hanya menambahkan tautan yang terlambat: metode Anda dalam notasi matriks, di mana saya mendasarkan fungsi yang saya katakan di atas. stats.stackexchange.com/a/237811/3277
ttnphns
1
@amoeba mengacu pada subset dariK{1,2,...,n}.
whuber