Python 给定二维空间中的一组边界框,将它们分组为行

Python 给定二维空间中的一组边界框,将它们分组为行,python,algorithm,geometry,computational-geometry,Python,Algorithm,Geometry,Computational Geometry,给定一组带有顶点坐标的N边界框: "vertices": [ { "y": 486, "x": 336 }, { "y": 486, "x": 2235 }, { "y": 3393, "x": 2235 }, { "y": 3393, "x": 336 } ] 我想将边界框分组成行。换句话说,鉴于此图中边界框的图示:

给定一组带有顶点坐标的N边界框:

"vertices": [
    {
      "y": 486, 
      "x": 336
    }, 
    {
      "y": 486, 
      "x": 2235
    }, 
    {
      "y": 3393, 
      "x": 2235
    }, 
    {
      "y": 3393, 
      "x": 336
    }
  ]
我想将边界框分组成行。换句话说,鉴于此图中边界框的图示:

我想要一个返回以下结果的算法:

[1,2,3]
[4,5,6]
[7,8]
[编辑:澄清]分组决策(如[4,5,6]和[7,8])应基于某种误差最小化,如最小二乘法


是否有算法或库(最好是python)可以做到这一点?

我认为这是一个集群问题。事实上,因为你可以忽略x坐标,我认为这是一个一维聚类问题。一些标准的聚类算法,比如k-means,对于最小化来自聚类中心的平方和是很好的,这相当于您正在寻找的结果。不幸的是,他们不能保证找到全球最佳的解决方案。一维聚类是一种特殊情况,有精确的算法-请参见。

您可以在(1,2,3)下画一条水平线,它不会穿过任何框,因此(1,2,3)是分开的。但是,您不能以这种方式拆分(4,5,6,7,8)。那么你如何定义(4,5,6)(7,8)的选择,而不是例如(5,6)(4,8)(7)?啊,我应该澄清-我以这种方式构建了问题,因此算法必须使用某种最小二乘误差优化(或替代方案)。边界框并不总是清晰可分的。1D群集不是将(4,5,6,7,8)聚合在一起吗?使用群集时,您通常会告诉它要将点划分成的不同群集的数量,因此它是否将任何一组点组合在一起将取决于您要求的群集数量。或者,您可以创建一个随创建的簇数而增加的惩罚,并找到提供最佳惩罚总数和偏差平方和的解决方案。然后你试着找到一个惩罚系统,让你得到你想要的分数;在本例中,(4,5,6)(7,8)是比(5,6)(4,7,8)更好的分割,这一事实只有在您知道4和7水平重叠时才会变得明显。(除非惩罚系统可以重新引入x坐标。)嗯,带有惩罚函数的ok聚类看起来确实是这个问题的正确分类。维度和如何选择最能代表每个方框的x/y坐标存在一些细微差别,即它是否应该只是坐标的平均值(无论是一维还是二维)?但是好吧,我会接受这个答案,谢谢!谢谢我没有引用示例惩罚函数,因为集群书籍通常不会提交它们自己,但有一个选项可以尝试:AIC=2k+n ln(RSS)。这里k是簇的数量(因为每个簇有一个参数-x坐标),n是数据点的数量,RSS是误差的平方和,或距离最近簇中心的偏差的平方和。所以你可以把AIC作为最终的惩罚函数。