math - 非功能线的线性回归/寻线

标签 math geometry numerical

我想找到一条线,该线周围有许多点。线位于二维空间中,由两个点或一个点和一个角度定义。它的算法是什么?

在 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/

相关文章:

c# - 带有数字键的动态 json 对象

matlab - 如何在不获取 inf 的情况下计算 matlab 中的指数?

c++ - 如何用g2o优化多约束函数

javascript - 如果 JavaScript 中的值相同,如何再次使用 math.random 来获取不同的值

c++ - 用c++做一颗心

ios - 将 SKSpriteNode 裁剪成圆角矩形

c# - 奇怪的数字错误

java - 数字滤波器,Java 数学,

algorithm - 在多个处理器上进行大整数模乘的最快运行时间是多少?

javascript - 为什么我的 Sprite /实体不能直线移动?