Bu ilginç soruna yaklaşmanın bir yolu, onu iki değişkenli nokta dağılımının merkezinin sağlam bir tahmincisi olarak görmektir. (İyi bilinen) bir çözüm, hiçbir şey kalmayana kadar dışbükey gövdeleri soymaktır . Son boş olmayan gövdenin centroidi merkezi bulur.
(Bu bagplot ile ilgilidir . Daha fazla bilgi için Web'de "dışbükey gövde soyma çok değişkenli aykırı değerlerini arayın").
Gösterilen 16 noktanın sonucu, bu haritada merkezi üçgen olarak gösterilmiştir. Çevredeki üç çokgen birbirini izleyen dışbükey gövdeleri gösterir. İlk iki adımda (toplamın% 30'u!) İlk iki adımda çıkarıldı.
Örnek hesaplandı R
. Algoritmanın kendisi orta blokta "dışbükey peeling" içinde uygulanır. chull
Gövdedeki noktaların dizinlerini döndüren yerleşik rutini kullanır . Bu noktalar negatif indeksleme ifadesi ile kaldırılır xy[-hull, ]
. Bu, son noktalar kaldırılana kadar tekrarlanır. Son adımda, sentroid koordinatların ortalaması alınarak hesaplanır.
Çoğu durumda verilerin projelendirilmesi bile gerekli değildir: dışbükey gövdeler orijinal özellikler antimeridian (+/- 180 derece boylam), kutuplardan herhangi birini veya o kadar genişse aralarındaki segmentlerin eğriliğini kapsıyorsa değişmeyecektir. bir fark yarat. (O zaman bile eğrilik çok endişe verici olacaktır, çünkü soyma hala merkezi bir noktaya yakınlaşacaktır.)
#
# 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")