2015-11-23 14 views
6

Il mio obiettivo è quello di adattare alcuni dati a una funzione polinomiale e ottenere l'equazione attuale inclusi i valori dei parametri adattati.Come estrarre l'equazione da un adattamento polinomiale?

Ho adattato this example ai miei dati e il risultato è come previsto.

Ecco il mio codice:

import numpy as np 
import matplotlib.pyplot as plt 

from sklearn.linear_model import Ridge 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn.pipeline import make_pipeline 


x = np.array([0., 4., 9., 12., 16., 20., 24., 27.]) 
y = np.array([2.9,4.3,66.7,91.4,109.2,114.8,135.5,134.2]) 

x_plot = np.linspace(0, max(x), 100) 
# create matrix versions of these arrays 
X = x[:, np.newaxis] 
X_plot = x_plot[:, np.newaxis] 

plt.scatter(x, y, label="training points") 

for degree in np.arange(3, 6, 1): 
    model = make_pipeline(PolynomialFeatures(degree), Ridge()) 
    model.fit(X, y) 
    y_plot = model.predict(X_plot) 
    plt.plot(x_plot, y_plot, label="degree %d" % degree) 

plt.legend(loc='lower left') 

plt.show() 

enter image description here

Tuttavia, ora non so dove per estrarre l'equazione reale e valori dei parametri a muro per i rispettivi attacchi. Dove posso accedere all'equazione montata effettiva?

EDIT:

La variabile model ha i seguenti attributi:

model.decision_function model.fit_transform  model.inverse_transform model.predict   model.predict_proba  model.set_params   model.transform   
model.fit    model.get_params   model.named_steps  model.predict_log_proba model.score    model.steps 

model.get_params non memorizza i parametri desiderati.

risposta

5

I coefficienti del modello lineare sono memorizzati negli attributi intercept_ e coeff_ del modello.

Si può vedere questo più chiaramente abbassando la regolarizzazione e l'immissione in un modello conosciuto; per esempio.

import numpy as np 
from sklearn.linear_model import Ridge 
from sklearn.pipeline import make_pipeline 
from sklearn.preprocessing import PolynomialFeatures 

x = 10 * np.random.random(100) 
y = -4 + 2 * x - 3 * x ** 2 

model = make_pipeline(PolynomialFeatures(2), Ridge(alpha=1E-8, fit_intercept=False)) 
model.fit(x[:, None], y) 
ridge = model.named_steps['ridge'] 
print(ridge.coef_) 
# array([-4., 2., -3.]) 

noti inoltre che il PolynomialFeatures predefinita include un termine di polarizzazione, in modo da montare l'intercetta in Ridge sarà ridondante per piccole alpha.

+0

Ottimo, funziona. Un po 'nascosto, secondo me. Lo prevedo e lo accetto più tardi. – Cleb

+0

È "nascosto" perché scikit-learn è una libreria di apprendimento automatico, non una libreria di modellazione statistica. In generale, Machine Learning si concentra sugli output dei modelli piuttosto che sui parametri dei modelli. Vedi [Statistical Modelling: The Two Cultures] (https://projecteuclid.org/euclid.ss/1009213726) per una discussione classica su questa divisione. – jakevdp

+0

Grazie per il link! Useresti scikit-learn per questo tipo di stima dei parametri o altrimenti sarebbe più appropriato qualcos'altro? Sto chiedendo poiché vorrei ad es. per evitare valori negativi e non sono sicuro di quanto sarebbe facile usare questo modulo. – Cleb

Problemi correlati