【问题标题】:How to find the smallest ellipse covering a given fraction of a set of points in R?如何找到覆盖R中一组点的给定部分的最小椭圆?
【发布时间】:2015-01-04 18:24:37
【问题描述】:

我想知道:是否有一些函数/聪明的方法可以找到覆盖 R 中一组 2d 点的给定部分的 最小 椭圆? 使用 smallest 我的意思是面积最小的椭圆。

澄清:如果点的数量很大,我可以用一个近似正确的解决方案(因为我猜一个精确的解决方案必须尝试点子集的所有组合)

这个问题可能听起来像问题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)

生成的椭圆显然不是包含一半点的最小椭圆,我猜它是一个覆盖左上角三个点的小椭圆。

【问题讨论】:

  • 如果你没有实现你想要的算法,那么你应该得到一个,也许在 crossvalidated.com,然后在这里询问如何实现它。
  • 你可以在这里通过谷歌快速搜索找到算法:gis.stackexchange.com/questions/22562/…
  • @Seth 我认为这是一个“算法”问题,而不是“统计”问题。而且肯定已经存在算法了吗?
  • @Bernardo 不,这不是我正在寻找的算法。它用于找到覆盖 100% 点的最小椭圆。我正在寻找覆盖 p % 点的最小椭圆,其中 p 可以是任何百分比。
  • @Bernardo:是的,但是详尽地枚举包含 N 个点的子集直到找到最小的椭圆可能不切实际!

标签: r minimum ellipse


【解决方案1】:

这听起来很像 2D 置信区间。试试http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/ellipsoidhull.html。您可能需要在 N 个点的每个组合上运行它,然后选择最小的结果。

【讨论】:

  • 不,这与置信区间没有直接关系。您提出的类似方法会导致一种算法用于查找覆盖 100% 点的最小椭圆。我正在寻找覆盖 p % 点的最小椭圆,其中 p 可以是任何百分比。
  • OP 在他们原来的例子中有dataEllipse - 没有做他们正在寻找的东西
  • 我的意思是,取N 的每个组合指向N= p/100 * total,然后选择最小的。但是,是的,当有很多点时,这会很慢。
【解决方案2】:

我想我有一个需要两个函数的解决方案,MASS 包中的 cov.robcluster 包中的 ellipsoidhullcov.rob(xy, quantile.used = 50, method = "mve") 在包含在最小体积椭圆中的xy 的二维点总数中找到大约“最佳”50 个点。然而,cov.rob 不直接返回 this 椭圆,而是从最佳点估计的其他一些椭圆(目标是稳健地估计协方差矩阵)。要找到实际的最小椭圆,我们可以给找到最小椭圆的ellipsoidhull 提供最佳点,我们可以使用predict.ellipse 来获取定义椭圆外壳的路径的坐标。

我不是 100% 确定这种方法是最简单的和/或它 100% 有效(感觉应该可以避免使用 ellipsoidhull 的第二步,但我没有想到怎么样。)。它似乎至少适用于我的玩具示例....

废话不多说,代码如下:

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)

【讨论】:

  • 应该补充一点,近似算法可以说是相当“近似”的。如果您有很多(> 1000)点,您可能希望运行算法的时间超过标准设置(nsamp = 3000)。例如:fit &lt;- cov.rob(xy, quantile.used = 3, method = "mve", nsamp = 10000) 虽然这需要几秒钟...
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多