加权最小二乘法 - 将平面拟合到三维点集

Jaa*_*a-c 5 algorithm math geometry linear-algebra least-squares

我使用最小二乘法将平面拟合到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];
}
Run Code Online (Sandbox Code Playgroud)

而不是制作矩阵:

double[][] A = {
    {fSumXX, fSumXY, fSumX},
    {fSumXY, fSumYY, fSumY},
    {fSumX,  fSumY,  pointCloud.size()}
};

double[][] B =  {
    {fSumXZ},
    {fSumYZ},
    {fSumZ}
};
Run Code Online (Sandbox Code Playgroud)

比解Ax = B,解的3个分量是拟合平面的系数...

那么,你能帮助我如何修改它来使用权重吗?谢谢!

YXD*_*YXD 9

直觉

的点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
Run Code Online (Sandbox Code Playgroud)

现在这假设我们知道飞机上的某些p.我们可以很容易地计算出一个质心,它只是点云中点的分量方式,并且总是位于最小二乘平面中.

让我们定义一个矩阵M,其中每一行是减去质心的ith点,我们可以重写:x_ic

f(n) = | M n |^2
Run Code Online (Sandbox Code Playgroud)

您应该能够说服自己这个矩阵乘法版本与前一个等式的总和相同.

然后,您可以采取奇异值分解M,和n你想,然后由右奇异向量给出的M对应最小奇异值.

要合并权重,您只需w_i为每个点定义权重.计算c为点的加权平均值,并sum_i | n.(x_i - c) |^2以类似的方式更改为sum_i | w_i * n.(x_i - c) |^2矩阵M.然后像以前一样解决.