[英]Algorithm for best fit rectangle
我正在寻找一种算法,以使任意矩形最适合无序点集。 具体来说,我正在寻找一个矩形,该矩形的点到任一矩形边缘的距离之和最小。 我发现很多最佳拟合线,圆和椭圆算法,但没有一个适合矩形。 理想情况下,我想要用C,C ++或Java编写的东西,但对语言的要求并不高。
输入数据通常将由位于矩形上或矩形附近的大多数点组成,并且具有一些异常值。 数据的分布将是不均匀的,不可能包含所有四个角。
以下是一些可能对您有所帮助的想法。
我们可以估计一个点是在边上还是在拐角上,如下所示:
Covariance = ((0, 0), (0, 0))
开头 d = point - centroid
Covariance += outer_product(d, d)
提取所有角点并进行分割。 选择条目最多的四个细分。 这些线段的质心是矩形角的候选对象。
计算两个相对侧的归一化方向向量,并计算其平均值。 计算另外两个相对边的平均值。 这些是平行四边形的方向向量。 如果需要矩形,请计算与这些方向之一垂直的向量,并与另一个方向向量计算平均值。 那么矩形的方向是均值向量和垂直向量。
为了计算拐角,可以将候选对象投影到其方向上并移动它们,以使它们形成矩形的拐角。
这是一个总体思路。 用小格做成网格; 计算每个非太空单元格的最佳拟合线(计算为立即数1 ,不涉及搜索)。 加入相邻的单元格,同时确保标准偏差正在改善/不会明显恶化。 因此,我们检测到四个边和四个角,并将我们的点划分为四个组,每个组属于四个边之一。
接下来,我们丢弃角单元,将真实的矩形替换为四个近似线,然后进行一些爬坡(或其他操作)。 在这种情况下,可能会增加最佳拟合线的计算,因为这两条线是平行的,并且我们已经将点分为四个组(对于给定的矩形,我们知道两个相对侧之间的增量y(因此,我们只需将此增量-y与较低的一组点的y
相加即可进行计算)。
最初的矩形网格可以用条纹(例如,垂直)加工代替。 然后,至少一半的条纹将具有两个明显的点分组(通过将每个条纹按水平分割线划分为像元来查找它们)。
1对于线Y = a*X+b
,最小化数据点{x i ,y i }到该线的垂直距离的平方和。 对于a
和b
可直接解决。 要获得更多垂直线,请翻转Xs和Ys。
PS I将问题解释为最大程度地减少了每个点到矩形最近侧 (而不是矩形所有侧)的垂直距离的平方和。
最佳拟合线的想法是计算点与线y = ax + b之间的垂直距离。 然后,您可以使用微积分找到a和b的值,以最小化距离平方和。 之所以选择平方而不是绝对值,是因为前者在0时可微。
如果要对矩形尝试相同的方法,则会遇到一个问题,即到矩形边的距离的平方是由8个不同块组成的分段定义函数,当这些块在内部相交时是不可微的长方形。
为了继续进行下去,您需要确定一个函数,该函数测量点与到处都是可微分的矩形的距离。
我不确定,但是从您的角度来看,您可能会在PCA的前2(3?)个维度上玩游戏。 在大多数情况下,它将运行得相当快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.