Подгонка линейной поверхности с наименьшими квадратами
Поэтому я хочу решить уравнение 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 и подстановку вперед-назад.