非功能线的线性回归/线查找

Linear regression / line finding for non-function lines

我想找到一条线,该线周围有许多点。直线是二维的 space 并且由两点定义,或者由一个点和一个角定义。它的算法是什么?

在 SO 和 Internet 以及 Numerical Receipes 上有很多关于此的内容,但所有示例似乎都集中在行 (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

E将通过选择d = a'*M来最小化,a作为C的特征向量对应于较小的特征值。

所以算法是:

计算 M 和 C

求C的较小的特征值和对应的特征向量a

计算 d = a'*M

(请注意,同样的事情也适用于更高的维度。例如在 3d 中我们会找到 'best' 平面)。