我想知道:是否有一些功能/巧妙的方法来找到覆盖R中一组2d点的给定部分的最小椭圆? With 最小我指的是面积最小的椭圆。
澄清:如果点数很大,我可以使用近似正确的解决方案(因为我猜一个确切的解决方案必须尝试所有点的子集组合)
这个问题可能听起来像是问题Ellipse containing percentage of given points in R的重复,但问题的表达方式得出的答案并不会产生最小的椭圆。例如,使用Ellipse containing percentage of given points in R给出的解决方案:
require(car)
x <- runif(6)
y <- runif(6)
dataEllipse(x,y, levels=0.5)
得到的椭圆显然不是包含一半点的最小椭圆,我猜,它是一个小椭圆,覆盖左上角的三个点。
答案 0 :(得分:4)
我想我的解决方案需要两个函数,cov.rob
包中的MASS
和ellipsoidhull
包中的cluster
。 cov.rob(xy, quantile.used = 50, method = "mve")
找到大约最好的&#34; xy
中包含在最小体积椭圆中的2d点总数中的50个点。但是,cov.rob
并不直接返回此椭圆,而是从最佳点估计的其他椭圆(目标是稳健地估计协方差矩阵)。为了找到实际的最小椭圆,我们可以给ellipsoidhull
找到最小椭圆的最佳点,我们可以使用predict.ellipse
来找出定义椭圆外壳的路径的坐标。
我不是100%肯定这种方法最简单和/或它100%工作(感觉应该可以避免使用ellipsoidhull
的秒步骤,但我havn没弄明白。)。它至少在我的玩具示例中起作用....
足够说话,这是代码:
library(MASS)
library(cluster)
# Using the same six points as in the question
xy <- cbind(x, y)
# Finding the 3 points in the smallest ellipse (not finding
# the actual ellipse though...)
fit <- cov.rob(xy, quantile.used = 3, method = "mve")
# Finding the minimum volume ellipse that contains these three points
best_ellipse <- ellipsoidhull( xy[fit$best,] )
plot(xy)
# The predict() function returns a 2d matrix defining the coordinates of
# the hull of the ellipse
lines(predict(best_ellipse), col="blue")
看起来很不错!您还可以检查ellipse
对象以获取更多信息
best_ellipse
## 'ellipsoid' in 2 dimensions:
## center = ( 0.36 0.65 ); squared ave.radius d^2 = 2
## and shape matrix =
## x y
## x 0.00042 0.0065
## y 0.00654 0.1229
## hence, area = 0.018
这是一个方便的函数,它将椭圆添加到现有的基本图形图中:
plot_min_ellipse <- function(xy, points_in_ellipse, color = "blue") {
fit <- cov.rob(xy, quantile.used = points_in_ellipse, method = "mve")
best_ellipse <- ellipsoidhull( xy[fit$best,] )
lines(predict(best_ellipse), col=color)
}
让我们在更多的点上使用它:
x <- runif(100)
y <- runif(100)
xy <- cbind(x, y)
plot(xy)
plot_min_ellipse(xy, points_in_ellipse = 50)
答案 1 :(得分:0)
这听起来非常像2D置信区间。试试http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/ellipsoidhull.html。您可能需要在N个点的每个组合上运行它,然后选择最小的结果。