如何解决加权最小二乘-使平面适合3D点集
的点x
上的平面限定由正常n
和上平面上的点p
服从:n.(x - p) = 0
。如果点y
不在平面上,n.(y
-p)
将不等于零,因此定义成本的一种有用方法是|n.(y - p)|^2
。这是点y
到平面的平方距离 。
在权重相等的情况下,您希望找到一个n
在对各点求和时将总平方误差最小化的:
f(n) = sum_i | n.(x_i - p) |^2
现在假设我们知道飞机上的 某个 点p
。我们可以轻松地将质心计算为质心,质心只是点云中各点的按分量平均,并且始终位于最小二乘平面中。
让我们定义一个矩阵M
,其中每行是ith
点x_i
减去质心c
,我们可以重写:
f(n) = | M n |^2
您应该能够使自己确信,此矩阵乘法版本与先前公式的总和相同。
然后,您可以采取奇异值分解的M
,和n
你想的那么由右奇异向量给出M
对应于最小奇异值。
要合并权重,您只需w_i
为每个点定义一个权重。计算c
为点的加权平均值,然后sum_i | n.(x_i - c)
|^2
以类似的方式更改为sum_i | w_i * n.(x_i - c) |^2
和M
。然后像以前一样解决。
解决方法
我正在用最小二乘法将平面拟合到3D点集。我已经有算法可以做到这一点,但是我想对其进行修改以使用加权最小二乘。意思是我对每个点都有权重(权重越大,平面应该越靠近该点)。
当前算法(无权重)如下所示:
计算总和:
for(Point3D p3d : pointCloud) {
pos = p3d.getPosition();
fSumX += pos[0];
fSumY += pos[1];
fSumZ += pos[2];
fSumXX += pos[0]*pos[0];
fSumXY += pos[0]*pos[1];
fSumXZ += pos[0]*pos[2];
fSumYY += pos[1]*pos[1];
fSumYZ += pos[1]*pos[2];
}
比做矩阵:
double[][] A = {
{fSumXX,fSumXY,fSumX},{fSumXY,fSumYY,fSumY},{fSumX,fSumY,pointCloud.size()}
};
double[][] B = {
{fSumXZ},{fSumYZ},{fSumZ}
};
比解Ax = B且解的3个分量是拟合平原的系数…
那么,您能帮我如何修改此值以使用权重吗?谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。