我想找到一条线,该线周围有许多点。线位于二维空间中,由两个点或一个点和一个角度定义。它的算法是什么?
在 SO、互联网以及数值收据中都有很多关于此的内容,但所有示例似乎都集中在线 (y=ax+b) 的函数形式上,这对于(几乎)垂直的情况不太适用行。
我可能会检测线条是否更水平或更垂直,并在其他情况下交换坐标,但也许存在一些更优雅的解决方案?
我正在使用 C# ATM,但可能可以从任何代码进行翻译。
最佳答案
很抱歉,我无法提供引用,但具体方法如下:
假设您的 N (2d) 个数据点是 p[],并且您想要找到一个向量 a 和一个标量 d 来最小化
E = Sum{ i | sqr( a'*p[i] - d) }/N
(直线为 { q | a'*q = d} E 是数据点到直线的距离的平方和)。
一些乏味的代数表明
E = a'*C*a + sqr(d - a'*M)
其中 M 是数据的平均值,C 是数据的协方差,即
M = Sum{ i | p[i] } / N
C = Sum{ i | (p[i]-M)*(p[i]-M)' } / N
通过选择 d = a'*M 来最小化 E,并且 a 为 C 的特征向量,对应于较小的特征值。
所以算法是:
计算 M 和 C
求C的较小特征值和对应的特征向量a
计算 d = a'*M
(请注意,同样的事情也适用于更高的维度。例如,在 3d 中,我们会找到“最佳”平面)。
关于math - 非功能线的线性回归/寻线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35404104/