numpy

2012-06-11 20 views
17

साथ बहुभिन्नरूपी बहुपद प्रतिगमन मैं कई नमूने (y_i, (a_i, b_i, c_i)) जहां y एक निश्चित डिग्री करने के लिए a,b,c में एक बहुपद के रूप में अलग-अलग माना जाता है की है। डेटा का एक सेट के लिए उदाहरण और डिग्री 2 के लिए मैं मॉडलnumpy

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

यह कम से कम वर्गों का उपयोग किया जा सकता है और numpy के polyfit दिनचर्या के एक मामूली विस्तार है उत्पादन हो सकता है। क्या पाइथन पारिस्थितिक तंत्र में कहीं मानक कार्यान्वयन है?

+2

मैंने इस समस्या को हल करने के लिए यहां कोड पोस्ट किया है [https://github.com/mrocklin/multipolyfit ](https://github.com/mrocklin/multipolyfit) – MRocklin

उत्तर

2

पॉलीफिट काम करता है, लेकिन वहां कम से कम स्क्वायर मिनीमाइज़र हैं। मैं कम से

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

यह और अधिक मजबूत है कि polyfit kmpfit, उपलब्ध की सिफारिश करेंगे, और वहाँ अपने पृष्ठ पर एक उदाहरण दिखाता है जो कि कैसे एक सरल रैखिक फिट है कि एक 2 आदेश कर की मूल बातें प्रदान करना चाहिए करने के लिए है बहुपद फिट।

 

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) 

इन बातों की सफलता फिट करने के लिए प्रारंभिक मूल्यों पर बारीकी से निर्भर है, इसलिए सावधानी से यदि संभव हो तो चुना है। इतने सारे मुफ्त पैरामीटर के साथ समाधान प्राप्त करना एक चुनौती हो सकती है।

+1

क्या आप पॉलीफिट का उपयोग करके बहुविकल्पीय प्रतिगमन का उदाहरण पोस्ट कर सकते हैं ? मुझे विश्वास नहीं है कि यह समर्थित है। Kmpfit के लिए प्रलेखन को देखने के बाद मुझे डर है कि यह इस पुस्तकालय के बारे में भी सच हो सकता है। – MRocklin

+0

आप फिट करने की कोशिश कर रहे हैं, y (x) = a * x ** 2 + b * x + c? वैसे भी, आप निश्चित रूप से mpfit/kmpfit के साथ multivariable फिटिंग कर सकते हैं। – reptilicus

+0

नहीं, वाई (वी, एक्स, डब्ल्यू) = ए * वी ** 2 + बी * एक्स ** 2 + सी * डब्ल्यू ** 2 + डी * वी * एक्स + ई * वी * डब्ल्यू + एफ * एक्स * डब्ल्यू + जी * वी + एच * एक्स + आई * वाई + के – MRocklin

8

sklearn ऐसा करने का एक आसान तरीका प्रदान करता है।

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

और यहाँ उत्पादन:

एक उदाहरण here तैनात बंद बिल्डिंग

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

क्या आपके लिए 'हटाएं' फ़ंक्शन के कार्यान्वयन को शामिल करना संभव होगा? चीयर्स! –

+1

क्षमा करें, यह numpy है, https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html –

+0

'बहुपद' स्पष्ट रूप से क्या करता है? क्या मैं कोड देख सकता हूँ? –

0

sklearn उनके पाइपलाइन here का उपयोग कर एक अच्छा उदाहरण है। - बस पाइपलाइन में पारित

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) 

आप अपने डेटा अपने आप को बदलने की जरूरत नहीं है: यहाँ उनके उदाहरण का मूल है।

+3

वह उदाहरण बहुविकल्पीय प्रतिगमन का उपयोग नहीं करता है। –