2015-11-23 28 views
6

Moim celem jest dopasowanie niektórych danych do funkcji wielomianowej i uzyskanie rzeczywistego równania, w tym dopasowanych wartości parametrów.Jak wyodrębnić równanie z dopasowania wielomianu?

Zaadaptowałem this example do moich danych, a wynik jest zgodny z oczekiwaniami.

Oto mój kod:

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

Jednak teraz nie wiem gdzie wyodrębnić rzeczywiste równania i wyposażone wartości parametrów dla poszczególnych napadów. Gdzie mam uzyskać dostęp do rzeczywistego dopasowanego równania?

Edycja:

Zmienna model ma następujące cechy:

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 nie przechowuje pożądanych parametrów.

Odpowiedz

5

Współczynniki modelu liniowego są przechowywane w atrybutach modelu intercept_ i coeff_.

Widać to wyraźniej, zmniejszając regularyzację i podawanie znanego modelu; na przykład

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.]) 

Należy również pamiętać, że PolynomialFeatures domyślnie zawiera określenie polaryzacji, więc zamontowanie osią w Ridge będzie zbędny dla małych alpha.

+0

Świetnie, że działa. Niby ukryte, moim zdaniem. Podniosłem go i akceptuję później. – Cleb

+0

Jest "ukryty", ponieważ scikit-learn to biblioteka uczenia maszynowego, a nie biblioteka modelowania statystycznego. Ogólnie, uczenie maszynowe koncentruje się na wynikach modeli, a nie na parametrach modeli. Zobacz [Modelowanie statystyczne: dwie kultury] (https://projecteuclid.org/euclid.ss/1009213726), aby uzyskać klasyczną dyskusję na temat tego podziału. – jakevdp

+0

Dzięki za link! Czy używałbyś naukowego scikita do tego rodzaju oceny parametrów, czy też coś innego byłoby bardziej odpowiednie? Pytam, ponieważ chciałbym, na przykład, aby uniknąć ujemnych wartości i nie jestem pewien, jak łatwo byłoby użyć tego modułu. – Cleb