Взвешенный наименьший квадрат - подогнать плоскость к набору трехмерных точек

Я подгоняю плоскость к трехмерному набору точек методом наименьших квадратов. У меня уже есть алгоритм для этого, но я хочу изменить его, чтобы использовать взвешенный метод наименьших квадратов. Это означает, что у меня есть вес для каждой точки (чем больше вес, тем ближе должен быть самолет к точке).

Текущий алгоритм (без веса) выглядит так:

Вычислите сумму:

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 компонента решения являются коэффициентами подобранной плоскости...

Итак, не могли бы вы помочь мне, как изменить это, чтобы использовать веса? Спасибо!


person Jaa-c    schedule 11.02.2012    source источник
comment
К вашему сведению - если у вас может быть много точек (› скажем, 20) и/или координаты имеют большое смещение, никогда не вычисляйте статистику так, как вы это делаете (принимая суммы квадратов исходной позиции) - он плохо чувствителен к числовым ошибкам. Как минимум, вы можете сначала вычесть среднее значение координат X/Y/Z, затем выполнить обработку, а затем в конце добавить смещения обратно. Существуют и другие способы сделать это, специфичные для алгоритма, но я не совсем понимаю, как ваш алгоритм использует метод наименьших квадратов, поэтому не могу больше помочь.   -  person Jason S    schedule 12.02.2012
comment
Что вы имеете в виду под смещением? (извините, не понял в данном контексте).   -  person Jaa-c    schedule 12.02.2012
comment
Краткий пример: точки p1=(10001, 10002, 10003), p2=(10005, 10006, 10007), p3=(10009, 10004, 10008). Они имеют средние значения (10005, 10004, 10006). Таким образом, вы смещаете (переводите) координаты точки на величину, противоположную этой величине, чтобы получить p1' = (-4, -2, -3), p2' = (0,2,1), p3' = (4,0, 2). Затем сделайте свою математику, затем добавьте обратно в смещение.   -  person Jason S    schedule 12.02.2012


Ответы (3)


Интуиция

Точка 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 аналогичным образом. Затем решите, как раньше.

person YXD    schedule 11.02.2012

Умножьте каждый член каждой суммы на соответствующий вес. Например:

fSumZ += weight * pos[2];
fSumXX += weight * pos[0]*pos[0];

Поскольку pointCloude.size() является суммой 1 для всех точек, ее следует заменить суммой всех весов.

person Jeffrey Sax    schedule 11.02.2012
comment
Я думал, что достаточно умножить каждое слагаемое на вес, но я не был уверен... Я попробую и вернусь. Спасибо. - person Jaa-c; 12.02.2012

Начните с переопределения расчета ошибки методом наименьших квадратов. Формула пытается минимизировать сумму квадратов ошибок. Умножьте квадрат ошибки на функцию двух точек, которая уменьшается с расстоянием между ними. Затем попытайтесь минимизировать взвешенную сумму квадратов ошибок и вывести из нее коэффициенты.

person Sufian Latif    schedule 11.02.2012