Eine Möglichkeit, dieses interessante Problem anzugehen, besteht darin, es als robusten Schätzer für das Zentrum einer bivariaten Punktverteilung zu betrachten. Eine (bekannte) Lösung besteht darin , konvexe Hüllen abzuziehen, bis nichts mehr übrig ist . Der Schwerpunkt des letzten nicht leeren Rumpfes lokalisiert die Mitte.
(Dies hängt mit dem Bagplot zusammen . Weitere Informationen finden Sie im Internet nach "Multivariate Ausreißer mit konvexem Rumpfschälen".)
Das Ergebnis für die 16 dargestellten Punkte wird in dieser Karte als zentrales Dreieck angezeigt. Die drei umgebenden Polygone zeigen die aufeinanderfolgenden konvexen Hüllen. Die fünf Randpunkte (30% der Gesamtzahl!) Wurden in den ersten beiden Schritten entfernt.
Das Beispiel wurde in berechnet R
. Der Algorithmus selbst ist im mittleren Block "konvexes Peeling" implementiert. Es verwendet die integrierte chull
Routine, die die Indexe der Punkte auf dem Rumpf zurückgibt. Diese Punkte werden mittels des negativen Indexausdrucks entfernt xy[-hull, ]
. Dies wird wiederholt, bis die letzten Punkte entfernt werden. Im letzten Schritt wird der Schwerpunkt durch Mitteln der Koordinaten berechnet.
Beachten Sie, dass in vielen Fällen eine Projektion der Daten nicht einmal erforderlich ist: Die konvexen Hüllen ändern sich nur, wenn die ursprünglichen Merkmale den Antimeridian (+/- 180 Grad Länge) überspannen oder so groß sind, dass die Krümmung der Segmente zwischen ihnen zunimmt Einen Unterschied machen. (Selbst dann ist die Krümmung von geringer Bedeutung, da das Schälen immer noch zu einem zentralen Punkt konvergiert.)
#
# Project the data.
#
dy <- c(8,7,5,10,7,17,19,19,21,22,22,22,24,24,26,26)
dx <- c(66,67,66,89,89,79,78,76,75,81,78,77,75,80,77,83)
lat <- (28.702 + dy/1e5) / 180 * pi
lon <- (77.103 + dx/1e5) / 180 * pi
y <- dy
x <- cos(mean(lat)) * dx
#
# Convex peeling.
#
xy <- cbind(x, y)
while(TRUE) {
hull <- chull(xy)
if (length(hull) < nrow(xy)) {
xy <- xy[-hull, ]
} else {
xy.0 <- matrix(apply(xy, 2, mean), 1, 2)
break
}
}
#
# Plot the data `xy` and the solution `xy.0`.
#
plot(range(x), range(y), type="n", asp=1)
points(x, y, pch=21, bg="#a01010")
points(xy.0, pch=24, cex=1.2, bg="#404080")