给定3D点云,如何找到包含给定百分点的最小边界球?
即。如果我有一个带有一些噪声的点云,并且我想忽略5%的异常值,如果我不知道哪些点是异常值,我怎么能得到包含95%剩余点的最小球体?
示例:我想找到绿色球体,而不是红色球体:
我正在寻找一种合理快速而简单的算法。它不必找到最优解,合理的近似也很好。
我知道如何计算100%点的近似边界球,例如用Ritter的算法。
如何将此推广到找到包含x%点的最小球体的算法?
答案 0 :(得分:3)
只是一个想法:二元搜索。
首先,使用其中一个边界球algorithms来首先找到100%的边界球。
将95%球体的中心点固定为与100%球体的中心点相同。 (不能保证它是,但你说你可以用近似答案。)然后在球体半径上使用二分搜索,直到你得到95% +- epsilon
个点。
假设点从中心点按距离(或平方距离稍微快一些)进行排序,对于固定半径r
,需要O(log n)
次操作才能找到内部点的点数。半径为r
的球体,例如通过使用另一个二分搜索。右r
本身的二进制搜索需要这种评估的对数。因此,在找到100%球体后,整个搜索应该只需要O(log 2 n)步骤。
编辑:如果您认为缩小球体的中心距离整个球体太远,您可以重新计算边界球体,或者仅重新计算点集的质量中心,每次丢掉一些积分之后。每次重新计算不应超过O(n)。重新计算后,按距离新中心点的距离求助点。由于您希望它们已经几乎已经排序,您可以依赖冒泡排序,这对于近乎分类的数据在O(n + epsilon)中起作用。请记住,这些测试只需要一个对数,所以你应该能够完全接近O(n log 2 n)。
这取决于您正在寻找的确切表现以及您愿意为此牺牲的内容。 (我很高兴得知我错了,这对我来说是一个非常精确的算法。)
答案 1 :(得分:1)
距离平均点位置的距离可能会给出一个合理的指示,表明一个点是否是异常值。
该算法可能类似于:
答案 2 :(得分:1)
ryann的算法并不坏。我建议使用几何中位数进行证明,然后来到这个草图:
当然,它也会受到次优性的影响,但是在远离异常值的情况下应该会有所改善。总成本为O(N ^ 2)。
答案 3 :(得分:1)
我会迭代以下两个步骤直到收敛:
1)给定一组点,找到包围100%点的最小球体并计算出其中心。
2)给定一个中心,找到包含最接近中心的原始数字的95%的点组。
每个步骤减少(或至少不增加)所涉及球体的半径,因此您可以在半径停止减小时声明收敛。
事实上,我会从多个随机开始迭代,每次开始都是通过找到包含所有一小部分点的最小球体而产生的。我注意到,如果你有10个异常值,并且你将你的点集分成11个部分,那么这些部分中至少有一个不会有任何异常值。
(这非常基于https://en.wikipedia.org/wiki/Random_sample_consensus)
答案 4 :(得分:0)
找到欧几里得最小生成树,并按长度的降序检查边缘。对于每条边,考虑通过删除边获得的两个连接树中的点集。
如果较小的点集小于总数的5%,并且较大的点集周围的边界球不与其重叠,则删除较小的点集。 (如果你的点云中心有一个空白的空间,这个条件是必要的。)
重复此操作,直至达到阈值或长度足够小'你不在乎删除它们。