2015-11-27 15 views
7

Ich möchte inÄquivalent von `polyfit` für ein 2D-Polynom in Python

x, y
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) 

Arrays an eine Least-Squares-Lösung für die a Koeffizienten zu finden, und z der Länge 20. Im Grunde genommen Ich suche nach dem Äquivalent von numpy.polyfit aber für ein 2D-Polynom.

This question ist ähnlich, aber die Lösung wird über MATLAB bereitgestellt.

+0

keine Entschuldigung, ich habe es dort eingefügt. –

+0

sklearn hat [Kernel Ridge Regression] (http://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge) aber ich bin mir nicht sicher, ob Sie ' Alpha' zu 0. Würde das für Sie arbeiten? – simonzack

+0

Scipy's Splines könnten nützlich sein: https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html – Dietrich

Antwort

9

Hier ist ein Beispiel zeigt, wie Sie numpy.linalg.lstsq für diese Aufgabe verwenden können:

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) 

die Stellkoeffizienten coeff sind:

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

Beachten Sie, dass coeff[3] und coeff[6] entsprechen jeweils X**2 und Y**2, und sie sind in der Nähe von 1., weil die Beispieldaten mit Z = X**2 + Y**2 + small_random_component erstellt wurden.

+1

Was ist Ihr Ziel mit jeder dieser Linien? 'Z = X ** 2 + Y ** 2 + np.random.rand (* X.form) * 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 ' Warum glätten Sie diese Matrizen? 'X = X.flatten()' 'Y = Y.flatten()' – xeon123

+0

@ xeon123 das Ziel mit dem Ausdruck für 'Z' ist nur eine Stichprobe von Daten zu erstellen, um die Oberflächenanpassung zu testen. Ich musste 'X' und' Y' so abflachen, dass 'A' zu einem 2D-Array wird, welches das Format ist, das die' lstsq'-Löser benötigen. –