2015-11-27 106 views
7

ja jak znaleźć najmniejszych kwadratów rozwiązania dla współczynników a wodpowiednik `polyfit` do 2D wielomian Pythonie

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) 

podanej tablicy x, y i z długości 20. Zasadniczo Szukam odpowiednika numpy.polyfit, ale dla wielomianu 2D.

This question jest podobna, ale rozwiązanie jest dostarczane za pośrednictwem MATLAB.

+0

nie, przepraszam, dodałem go tam. –

+0

sklearn ma [regresji jądra kalenica] (http://scikit-learn.org/stable/modules/generated/sklearn.kernel_ridge.KernelRidge.html#sklearn.kernel_ridge.KernelRidge), ale nie jestem pewien, czy można ustawić ' alfa' do 0. Czy to zadziałałoby dla Ciebie? – simonzack

+0

Splajny Scipy mogą być użyteczne: https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html – Dietrich

Odpowiedz

9

Oto przykład pokazujący, jak można wykorzystać numpy.linalg.lstsq dla tego zadania:

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) 

modyfikacja współczynników coeff są:

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

Zauważ, że coeff[3] i coeff[6] odpowiadają odpowiednio X**2 i Y**2, i są bliskie 1., ponieważ dane przykładowe zostały utworzone za pomocą Z = X**2 + Y**2 + small_random_component.

+1

Jaki jest twój cel w każdej z tych linii? '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 ' Dlaczego spłaszczacie te macierze? 'X = X.flatten()' 'Y = Flatten()' – xeon123

+0

@ xeon123 celem z wyrażeniem dla 'Z' jest tylko utworzenie próbki danych w celu przetestowania dopasowania powierzchni. Musiałem spłaszczyć 'X' i' Y' tak, że 'A' staje się tablicą 2D, która jest formatem wymaganym przez solstery' lstsq'. –