【问题标题】:Fit a line through some 3D points通过一些 3D 点拟合一条线
【发布时间】:2021-07-29 06:09:00
【问题描述】:
早上好,
所以我拥有的是一堆 3D 点。
现在我只想在不将一个轴设置为零的情况下通过它拟合一条线!
我找不到任何东西,你能帮帮我吗?
(如果对我使用 Matlab 有帮助)
普通最小二乘拟合是一种选择吗?我刚刚读到它,现在还不清楚如何将它用于一条线。
【问题讨论】:
标签:
matlab
line
curve-fitting
least-squares
【解决方案1】:
假设你的分数是 Q1..Qn。我们可以通过线上的一个点 P 和一个指向该线的单位向量 u 来定义一条线。
在任何维度,我们都可以找到如下线。
给定一个点Q,那么直线上离Q最近的点是
Q^ = P + u'*(Q-P)*u
Q到直线的平方距离是Q到Q^的平方距离
dsq = || Q-Q^||^2 = ||(Q-P)||^2 - (u'*(Q-P))^2
找到最佳拟合线的一种方法是寻找使点与线的均方距离最小的线,即最小化
E = Sum{ j | ||(Q[j]-P)||^2 - (u'*(Q[j]-P))^2 }/n
一些相当乏味的代数表明这意味着
P = Sum{ j | Q[j]}/n -- ie the mean of the Qs
u 对应于C的最大特征值的C的特征向量,其中
C = Sum{ j | (Q[j]-P)*(Q[j]-P)'} -- the covariance of the Qs
所以找到 P 和 u 的练习是:
Compute P = Sum{ j | Q[j]}/n
Compute C = Sum{ j | (Q[j]-P)*(Q[j]-P)'}
对角化 C 并选择 u 作为最大特征值对应的特征向量。注意 C 是对称的,所以对角化应该不是问题。