Effiziente Methode zur Berechnung der Abstände zwischen Schwerpunkten aus der Entfernungsmatrix

8

Lassen Sie uns eine quadratische symmetrische Matrix quadratischer euklidischer Abstände zwischen Punkten und einem Vektor mit einer Länge von , die die Cluster- oder Gruppenzugehörigkeit ( Cluster) der Punkte anzeigt ; Ein Cluster kann aus Punkt bestehen.D.nnk1

Was ist hier die effizienteste oder wirklich effizienteste (in Bezug auf die Geschwindigkeit) Methode, um Entfernungen zwischen den Cluster-Schwerpunkten zu berechnen ?

Bisher habe ich in dieser Situation immer eine Hauptkoordinatenanalyse durchgeführt. PCoA oder Torgersons MDS bedeutet , zuerst in die Matrix der Skalarprodukte ("doppelte Zentrierung") umzuwandeln und dann eine PCA davon durchzuführen. Auf diese Weise erstellen wir Koordinaten für die Punkte in dem euklidischen Raum, den sie überspannen. Danach ist es einfach, die Abstände zwischen den Zentroiden auf die übliche Weise zu berechnen - wie Sie es mit Daten tun würden . PCoA muss eine Eigenzerlegung oder SVD des symmetrischen positiven Semidefinits , aberD.S.ngrouped points x variablesn x nS.nkann ziemlich groß sein. Außerdem ist die Aufgabe keine Dimensionsreduktionsaufgabe, und wir benötigen diese orthogonalen Hauptachsen tatsächlich nicht. Ich habe das Gefühl, dass diese Zerlegungen ein Overkill sein könnten.

Haben Sie Kenntnisse oder Ideen zu einem möglicherweise schnelleren Weg?

ttnphns
quelle

Antworten:

6

Lassen Sie die Punkte indizieren , alle in R d . Lassen Sie mich die Indizes für einen Cluster und J die Indizes für einen anderen Cluster sein. Die Zentroide sindx1,x2,,xnR.dichJ.

cich=1|ich|ichichxich, cJ.=1|J.|jJ.xj

und es ist erwünscht , ihren quadratischen Abstand finden in Bezug auf die quadratischen Abstände D i j = | | x i - x j | | 2 .||cich- -cJ.||2D.ichj=||xich- -xj||2

Genau so, wie wir Quadratsummen in ANOVA-Berechnungen aufschlüsseln würden, ist eine algebraische Identität

||cich- -cJ.||2=1|ich||J.|(S.S.(ichJ.)- -(|ich|+|J.|)(1|ich|S.S.(ich)+1|J.|S.S.(J.)))

wobei sich " " auf die Summe der Quadrate der Abstände zwischen jedem Punkt in einer Menge und ihrem Schwerpunkt bezieht. Die Polarisationsidentität drückt dies in quadratischen Abständen zwischen allen Punkten erneut aus:S.S.

S.S.(K.)=12ich,jK.||xich- -xj||2=ich<jK.D.ichj.

Ö((|ich|+|J.|)2)kÖ(n2/.k2)D.


R Es folgt ein Code zur Veranschaulichung und zum Testen dieser Berechnungen.

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
quelle
Perfekt! Ich muss gestehen, dass ich trotz der Parallelogrammidentitäten den Zusammenhang mit meiner Aufgabe nicht klar erkennen und die Formel ableiten konnte. Vielen Dank an Sie. Ich habe die Funktion (in SPSS) bereits basierend auf Ihrer Formel für eine beliebige Anzahl von Zentroiden programmiert und sie ist mit großer Matrix D tatsächlich schneller als der indirekte Weg über PCoA.
ttnphns
Ich möchte auch hinzufügen, dass die Formel gültig bleibt, wenn sich die Gruppen / Cluster durch die Zusammensetzung von Objekten schneiden.
ttnphns
Ja, das ist richtig: Die Identität, die ich verwende, setzt nicht voraus, dass die Cluster disjunkt sind.
whuber
Fügen Sie einfach einen späten Link hinzu: Ihre Methode in Matrixnotation, auf der ich die oben genannte Funktion basiert habe. stats.stackexchange.com/a/237811/3277
ttnphns
1
K.{1,2,,n}}.