这个问题来自破解编码访谈第7章的问题6。对我来说,作为一个数学家,这似乎是一个简单的最小二乘问题,我们可以找到最佳拟合线。不过,在解决方案中,他们采用了不同的方法。
我的问题如下:开发最小二乘法是否是足够的解决方案,还是我不了解当前的问题?
答案 0 :(得分:1)
Least squares isn't an appropriate solution, it doesn't care about the number of aligned points. The least-squares fit might contain no point at all.
The solution in the link by julian has an O(N²) behavior, assuming that a hash map has O(N) behavior to count duplicates. (With sorting, O(N²Log N) can be guaranteed.)
The main idea is to take every point in turn, to compute the directions to all other points, and count the coincident directions.
答案 1 :(得分:0)
我认为最小二乘不能在此处提供正确的解决方案。最小二乘可确保所有点的平方误差总和变得最小。这不能保证线应该位于这些点上。这样可能会导致这些点具有很高的方差,并且您会在其中点得到一条直线而没有碰到任何点。
我看问题的方式可以更简单地解决
查找线
找到所有斜率并在平面上为每对斜率截取。因此,使用斜率和截距创建的线中可能有多个点。您可以将每个这样的线方程式及其上的点存储在一起,然后找到点数最大的线。可以使用存储该方程式和该方程式上的点的哈希表来找到最大的线。
这可能是O(n ^ 3),因为您正在创建直线并检查每个点是否在直线上。
霍夫变换
有效的方法可能是使用Hough Transformation。这是线性时间。
每个2d点都映射到hough参数空间中的一条曲线... 我们将Hough参数空间离散化为MxN 如果我们有K点, 然后枚举所有点需要O(KN)时间, 我们在参数空间找到最大值(这可以在枚举时立即完成) 因此总体来说,它可能是线性的,尽管我对此不太确定。
RANSAC
我还找到了关于RANSAC算法的一个很好的资源,看起来像在做类似的工作。也许这可以帮助/
答案 2 :(得分:0)
您可以考虑使用双平面。
对于坐标为p_x,p_y的任何点p,都可以将其转换为双线p * =(y = p_x x-p_y)。
对于任何l行:y = mx + b,您都可以将其转换为对偶点l =(m,-b)
有关更多详细信息,请参见M. de Berg等人的“计算几何”第8.2章。
答案 3 :(得分:0)
霍夫变换主要是您要寻找的东西。您可以使用概率版本来加快速度,但要付出一些准确性。 OpenCv库已实现,但重新实现并不难。