Salah satu cara untuk mendekati masalah yang menarik ini adalah melihatnya sebagai penaksir yang kuat dari pusat distribusi titik bivariat. Solusi (terkenal) adalah mengupas kulit cembung sampai tidak ada yang tersisa . Centroid dari lambung non-kosong terakhir menempatkan pusat.
(Ini terkait dengan bagplot . Untuk informasi lebih lanjut, cari di Web untuk "outve hull peeling multivariate outlier.")
Hasil untuk 16 poin bergambar ditampilkan sebagai segitiga tengah dalam peta ini. Tiga poligon di sekitarnya menunjukkan lambung cembung berturut-turut. Lima poin terpencil (30% dari total!) Telah dihapus dalam dua langkah pertama.
Contoh dihitung dalam R
. Algoritme itu sendiri diimplementasikan di blok tengah, "convex peeling." Menggunakan chull
rutin bawaan, yang mengembalikan indeks poin pada lambung. Poin-poin ini dihapus dengan menggunakan ekspresi pengindeksan negatif xy[-hull, ]
. Ini diulangi sampai poin terakhir dihapus. Pada langkah terakhir, centroid dihitung dengan rata-rata koordinat.
Perhatikan bahwa dalam banyak kasus memproyeksikan data bahkan tidak diperlukan: lambung cembung tidak akan berubah kecuali fitur asli span antimeridian (+/- 180 derajat bujur), baik kutub, atau sangat luas sehingga kelengkungan segmen di antara mereka akan membuat perbedaan. (Bahkan saat itu kelengkungan akan menjadi perhatian kecil, karena mengupas masih akan menyatu ke titik pusat.)
#
# 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")