2012-06-11 20 views
17

Ich habe viele Proben (y_i, (a_i, b_i, c_i)), wo y vermutet wird, als ein Polynom in a,b,c bis zu einem gewissen Grad zu variieren. Zum Beispiel für einen bestimmten Satz von Daten und Grad 2 Ich könnte das ModellMultivariate Polynom-Regression mit numpy

y = a^2 + 2ab - 3cb + c^2 +.5ac

produzieren Dies kann getan werden, der kleinsten Quadrate verwendet und ist eine leichte Erweiterung der polyfit Routine numpy. Gibt es irgendwo im Python-Ökosystem eine Standardimplementierung?

+2

Ich habe hier Code geschrieben, um dieses Problem zu lösen [https://github.com/mrocklin/multipolyfit](https://github.com/mrocklin/multipolyfit) – MRocklin

Antwort

2

polyfit funktioniert, aber es gibt bessere kleine quadratische Minimizer da draußen. Ich würde kmpfit, erhältlich bei

http://www.astro.rug.nl/software/kapteyn-beta/kmpfittutorial.html

Es ist robuster, dass polyfit empfehlen, und es ist ein Beispiel auf ihrer Seite, die zeigt, wie eine einfache lineare Anpassung zu tun, die die Grundlagen zu tun, eine zweite Ordnung sorgen sollten polynomische Anpassung.

 

def model(p, v, x, w):  
    a,b,c,d,e,f,g,h,i,j,k = p  #coefficients to the polynomials  
    return a*v**2 + b*x**2 + c*w**2 + d*v*x + e*v*w + f*x*w + g*v + h*x + i*y + k 

def residuals(p, data):  # Function needed by fit routine 
    v, x, w, z = data   # The values for v, x, w and the measured hypersurface z 
    a,b,c,d,e,f,g,h,i,j,k = p #coefficients to the polynomials 
    return (z-model(p,v,x,w)) # Returns an array of residuals. 
           #This should (z-model(p,v,x,w))/err if 
           # there are error bars on the measured z values 


#initial guess at parameters. Avoid using 0.0 as initial guess 
par0 = [1.0, 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0] 

#create a fitting object. data should be in the form 
#that the functions above are looking for, i.e. a Nx4 
#list of lists/tuples like (v,x,w,z) 
fitobj = kmpfit.Fitter(residuals=residuals, data=data) 

# call the fitter 
fitobj.fit(params0=par0) 

Der Erfolg dieser Dinge hängt eng von den Startwerten für die Passform, wählte so sorgfältig, wenn möglich. Bei so vielen freien Parametern könnte es eine Herausforderung sein, eine Lösung zu finden.

+1

Können Sie ein Beispiel für multivariate Regression mit Polyfit posten ? Ich bin nicht davon überzeugt, dass dies unterstützt wird. Nach dem Durchlesen der Dokumentation für kmpfit befürchte ich, dass dies auch für diese Bibliothek gelten könnte. – MRocklin

+0

Was versuchst du anzupassen, y (x) = a * x ** 2 + b * x + c? Wie auch immer, Sie können sicherlich multivariable Anpassung mit mpfit/kmpfit tun. – reptilicus

+0

Nein, y (v, x, w) = a * v ** 2 + b * x ** 2 + c * w ** 2 + d * v * x + e * v * w + f * x * w + g * v + h * x + i * y + k – MRocklin

8

sklearn bietet eine einfache Möglichkeit, dies zu tun.

Aufbauend auf ein Beispiel here posted:

#X is the independent variable (bivariate in this case) 
X = array([[0.44, 0.68], [0.99, 0.23]]) 

#vector is the dependent data 
vector = [109.85, 155.72] 

#predict is an independent variable for which we'd like to predict the value 
predict= [0.49, 0.18] 

#generate a model of polynomial features 
poly = PolynomialFeatures(degree=2) 

#transform the x data for proper fitting (for single variable type it returns,[1,x,x**2]) 
X_ = poly.fit_transform(X) 

#transform the prediction to fit the model type 
predict_ = poly.fit_transform(predict) 

#here we can remove polynomial orders we don't want 
#for instance I'm removing the `x` component 
X_ = np.delete(X_,(1),axis=1) 
predict_ = np.delete(predict_,(1),axis=1) 

#generate the regression object 
clf = linear_model.LinearRegression() 
#preform the actual regression 
clf.fit(X_, vector) 

print("X_ = ",X_) 
print("predict_ = ",predict_) 
print("Prediction = ",clf.predict(predict_)) 

Und heres die Ausgabe:

>>> X_ = [[ 0.44 0.68 0.1936 0.2992 0.4624] 
>>> [ 0.99 0.23 0.9801 0.2277 0.0529]] 
>>> predict_ = [[ 0.49 0.18 0.2401 0.0882 0.0324]] 
>>> Prediction = [ 126.84247142] 
+0

Wären Sie in der Lage, die Implementierung der 'delete'-Funktion einzuschließen? Prost! –

+1

Sorry, es ist numpy, https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html –

+0

Was macht 'PolynomialFeatures' explizit? kann ich den Code sehen? –

0

sklearn hat ein schönes Beispiel ihre Pipeline mit here. Hier ist der Kern ihres Beispiel:

polynomial_features = PolynomialFeatures(degree=degrees[i], 
             include_bias=False) 
linear_regression = LinearRegression() 
pipeline = Pipeline([("polynomial_features", polynomial_features), 
        ("linear_regression", linear_regression)]) 
pipeline.fit(X[:, np.newaxis], y) 

Sie müssen Ihre Daten nicht selbst verwandeln - einfach in die Pipeline übergeben.

+3

Dieses Beispiel verwendet keine multivariate Regression. –