2012-06-11 15 views
17

Mam wiele próbek (y_i, (a_i, b_i, c_i)), gdziejest uważany za zmienny jako wielomian w a,b,c do pewnego stopnia. Na przykład dla danego zbioru danych i stopnia 2 mógłbym produkować modelWielowymiarowa regresja wielomianowa z numpy

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

Można to zrobić za pomocą metody najmniejszych kwadratów i jest nieznaczne rozszerzenie polyfit rutyny NumPy użytkownika. Czy gdzieś w ekosystemie Pythona istnieje standardowa implementacja?

+2

Opublikowałem kod, aby rozwiązać ten problem [https://github.com/mrocklin/multipolyfit](https://github.com/mrocklin/multipolyfit) – MRocklin

Odpowiedz

2

polyfit działa, ale istnieją lepsze minimalizatory najmniejsze kwadratowe. Polecam kmpfit, dostępnego na

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

Jest bardziej wytrzymała, że ​​polyfit, a tam jest przykładem na ich stronie, która pokazuje jak zrobić prosty liniowy dopasowanie, które powinny zapewnić podstawy robi 2nd zamówienie dopasowanie wielomianowe.

 

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) 

Sukces tych rzeczy jest ściśle uzależniona od wartości wyjściowych do ataku, więc wybrałem ostrożnie, jeśli to możliwe. Przy tak wielu darmowych parametrach rozwiązaniem może być wyzwanie.

+1

Czy możesz podać przykład regresji wielozmiennej za pomocą polyfit ? Nie jestem przekonany, że jest to obsługiwane. Po przejrzeniu dokumentacji dla kmpfit, obawiam się, że może to również dotyczyć tej biblioteki. – MRocklin

+0

Co próbujesz dopasować, y (x) = a * x ** 2 + b * x + c? W każdym razie, możesz z pewnością zrobić wielozmienny zestaw z mpfit/kmpfit. – reptilicus

+0

Nie, 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 zapewnia prosty sposób na zrobienie tego.

Budowanie off przykład zamieszczonych here:

#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_)) 

And Herezje wyjście:

>>> 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

Czy możliwe jest uwzględnienie implementacji funkcji 'delete'? Twoje zdrowie! –

+1

Niestety, jest to numpy, https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html –

+0

co robi funkcja 'PolynomialFeatures'? czy mogę zobaczyć kod? –

0

sklearn ma ładny przykład używając ich Pipeline here. Oto sedno ich przykładu:

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) 

Nie musisz samodzielnie przekształcać swoich danych - po prostu przenieś je do Pipeline.

+3

Ten przykład nie używa regresji wielowymiarowej. –