Подгонка линейной поверхности с наименьшими квадратами

Поэтому я хочу решить уравнение z= a + b*y +c*x,. получение a,b,c, То есть: приведение (плоской) поверхности к нагрузке точек рассеяния в трехмерном пространстве.

Но я не могу ничего найти! Я думал, что будет простой модуль для такой простой задачи.

Я пытался, где х, у, г массивы;

ys=zip(x,y)
(coeffs, residuals, rank, sing_vals) = np.linalg.lstsq(ys,z)

я прав в мышлении coeffs = b,c? Или я совсем не в том направлении. Я просто не могу найти что-нибудь еще, что будет работать в 3D...

2 ответа

Решение

Я думаю, что вы на правильном пути. Вы все еще можете попробовать следовать примеру scipy.linalg документация, в частности раздел "Решение наименьших квадратов..."

A = np.column_stack((np.ones(x.size), x, y))
c, resid,rank,sigma = np.linalg.lstsq(A,zi)

(мы добавили столбец 1 для константы).

Константы a, b и c - это неизвестные, для которых вам нужно найти решение.

Если вы подставите в уравнение свои точки N (x, y, z), у вас будет N уравнений для 3 неизвестных. Вы можете написать это в виде матрицы:

[x1 y1 1]{ a }   { z1 }
[x2 y2 1]{ b }   { z2 }
[x3 y3 1]{ c } = { z3 }
    ...
[xn yn 1]        { zn }

Или же

Ac = z

где A - матрица Nx3, c - вектор 3x1, а z - вектор 3xN.

Если вы предварительно умножите обе стороны на транспонирование А, у вас будет уравнение с матрицей 3х3, которое вы можете найти для нужных вам коэффициентов.

Используйте разложение LU и подстановку вперед-назад.

Другие вопросы по тегам