Encajar una superficie lineal con números mínimos cuadrados.

Así que quiero resolver la ecuación z= a + b*y +c*x obteniendo a,b,c . es decir: hacer que una superficie (plana) se ajuste a una carga de puntos de dispersión en el espacio 3D.

¡Pero parece que no puedo encontrar nada! Pensé que habría un módulo simple para un problema tan simple.

He intentado, donde x, y, z son matrices;

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

¿Estoy en lo cierto al pensar coeffs = b, c? O voy completamente en la dirección equivocada. Parece que no puedo encontrar nada más que funcione en 3D …

Creo que estás en el camino correcto. Aún puede intentar seguir el ejemplo de la documentación de scipy.linalg , en particular la sección Resolviendo mínimos cuadrados … `

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

(Añadimos una columna de 1 para la constante).

Las constantes a, b y c son las incógnitas que necesitas resolver.

Si sustituye sus puntos N (x, y, z) en la ecuación, tendrá N ecuaciones para 3 incógnitas. Puedes escribir eso como una matriz:

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

O

 Ac = z 

donde A es una matriz Nx3, c es un vector 3×1 y z es un vector 3xN.

Si premultamente ambos lados por la transposición de A, tendrá una ecuación con una matriz de 3×3 que puede resolver para los coeficientes que desee.

Utilice la descomposición de LU y la sustitución hacia atrás.