この興味深い問題に取り組む1つの方法は、それを2変量点分布の中心のロバストな推定量と見なすことです。(よく知られている)解決策は、何もなくなるまで凸包をはがすことです。空でない最後の船体の重心が中心を特定します。
(これはバグプロットに関連しています。詳細については、「凸包剥離多変量外れ値」をWebで検索してください。)
16の図解されたポイントの結果は、このマップの中央の三角形として示されています。周囲の3つのポリゴンは、連続する凸包を示しています。5つの範囲外のポイント(全体の30%!)は、最初の2つのステップで削除されました。
例はで計算されましたR
。アルゴリズム自体は、中央のブロック「凸型ピーリング」に実装されています。これは、chull
船体上のポイントのインデックスを返す組み込みルーチンを使用します。これらのポイントは、負のインデックス式によって削除されますxy[-hull, ]
。これは、最後のポイントが削除されるまで繰り返されます。最後のステップでは、座標を平均して重心を計算します。
多くの場合、データを投影する必要はないことに注意してください。凸包は、元のフィーチャが時限線(経度+/- 180度)にまたがっているか、極であるか、非常に広すぎて、それらの間のセグメントの曲率が大きくならない限り、変化しません違いが生じる・異なる。(それでも剥離は中心点に収束するため、曲率はほとんど問題になりません。)
#
# 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")