Un modo per affrontare questo interessante problema è quello di vederlo come un solido stimatore del centro di una distribuzione di punti bivariati. Una (ben nota) soluzione è quella di staccare gli scafi convessi fino a quando non viene lasciato nulla . Il centroide dell'ultimo scafo non vuoto individua il centro.
(Questo è correlato al bagplot . Per ulteriori informazioni, cercare nel Web " valori anomali multivariati di peeling convessi dello scafo.")
Il risultato per i 16 punti illustrati è mostrato come il triangolo centrale in questa mappa. I tre poligoni circostanti mostrano i successivi scafi convessi. I cinque punti periferici (30% del totale!) Sono stati rimossi nei primi due passaggi.
L'esempio è stato calcolato in R
. L'algoritmo stesso è implementato nel blocco centrale, "peeling convesso". Utilizza la chull
routine integrata , che restituisce gli indici dei punti sullo scafo. Questi punti vengono rimossi mediante l'espressione di indicizzazione negativa xy[-hull, ]
. Questo si ripete fino a quando non verranno rimossi gli ultimi punti. Nell'ultimo passaggio, il centroide viene calcolato facendo la media delle coordinate.
Si noti che in molti casi la proiezione dei dati non è nemmeno necessaria: gli scafi convessi non cambieranno a meno che le caratteristiche originali non si estendano sull'antimeridiano (+/- 180 gradi di longitudine), su entrambi i poli, o siano così estese che la curvatura dei segmenti tra di loro fare la differenza. (Anche in questo caso la curvatura sarà di scarsa preoccupazione, perché il peeling convergerà comunque in un punto centrale.)
#
# 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")