2015-11-27 21 views
7

Vorrei trovare una soluzione dei minimi quadrati per i coefficienti a inequivalente di `polyfit` per un polinomio 2D in Python

z = (a0 + a1*x + a2*y + a3*x**2 + a4*x**2*y + a5*x**2*y**2 + a6*y**2 + 
    a7*x*y**2 + a8*x*y) 

trovati array x, y e z di lunghezza 20. Fondamentalmente Sto cercando l'equivalente di numpy.polyfit ma per un polinomio 2D.

This question è simile, ma la soluzione viene fornita tramite MATLAB.

+0

no scusa, l'ho aggiunto lì. –

+0

sklearn ha [kernel ridge regression] (http://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge) ma non sono sicuro che sia possibile impostare ' alfa' a 0. Potrebbe funzionare per te? – simonzack

+0

Scipy's Splines potrebbe essere utile: https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html – Dietrich

risposta

9

Ecco un esempio di come è possibile utilizzare numpy.linalg.lstsq per questo compito:

import numpy as np 

x = np.linspace(0, 1, 20) 
y = np.linspace(0, 1, 20) 
X, Y = np.meshgrid(x, y, copy=False) 
Z = X**2 + Y**2 + np.random.rand(*X.shape)*0.01 

X = X.flatten() 
Y = Y.flatten() 

A = np.array([X*0+1, X, Y, X**2, X**2*Y, X**2*Y**2, Y**2, X*Y**2, X*Y]).T 
B = Z.flatten() 

coeff, r, rank, s = np.linalg.lstsq(A, B) 

di regolazione coefficienti coeff sono:

array([ 0.00423365, 0.00224748, 0.00193344, 0.9982576 , -0.00594063, 
     0.00834339, 0.99803901, -0.00536561, 0.00286598]) 

noti che coeff[3] e coeff[6] corrispondono rispettivamente X**2 e Y**2, e sono vicini a 1. perché i dati di esempio sono stati creati con Z = X**2 + Y**2 + small_random_component.

+1

Qual è il tuo obiettivo con ciascuna di queste linee? 'Z = X ** 2 + Y ** 2 + np.random.rand (* X.shape) * 0.01' ' A = np.array ([X * 0 + 1, X, Y, X * * 2, X ** 2 * Y, X ** 2 * Y ** 2, Y ** 2, X * Y ** 2, X * Y]). T' Perché si appiattiscono queste matrici? 'X = X.flatten()' 'Y = Y.flatten()' – xeon123

+0

@ xeon123 l'obiettivo con l'espressione per 'Z' è solo per creare un campione di dati per testare l'adattamento della superficie. Ho dovuto appiattire 'X' e' Y' tali che 'A' diventa un array 2D, che è il formato richiesto dai risolutori' lstsq'. –