2012-04-13 15 views
8

के साथ 6 वीं डिग्री बहुपद का उपयोग करके गैरलाइन डेटा को इंटरपोल करने के लिए मेरे पास एक बहुत ही विशिष्ट आवश्यकता है। मैंने देखा है numpy/scipy दिनचर्या (scipy.interpolate.InterpolatedUnivariateSpline) है कि केवल डिग्री तक प्रक्षेप अनुमति देते हैं 5.6 वें डिग्री वक्र फिटिंग numpy/scipy

यह करने के लिए कोई सीधा समारोह है यहां तक ​​कि अगर वहाँ, वहाँ में Excel के LINEST रेखीय प्रतीपगमन एल्गोरिथ्म को दोहराने के लिए एक रास्ता है अजगर? LINEST 6 वें डिग्री वक्र-फिटिंग की अनुमति देता है लेकिन मैं एक्सेल का उपयोग किसी भी चीज़ के लिए नहीं करना चाहता क्योंकि यह गणना एक बहुत बड़ी पायथन लिपि का हिस्सा है।

किसी भी मदद की सराहना की जाएगी!

उत्तर

7

उपयोग numpys दिनचर्या polyfit आपके मामले में मैं कुछ इस तरह की कोशिश करेंगे।

http://docs.scipy.org/doc/numpy-1.3.x/reference/generated/numpy.polyfit.html

+0

मुझे विश्वास नहीं है कि मैंने इससे पहले नहीं सोचा था! धन्यवाद :) – prrao

+1

+1 मुझे विश्वास नहीं है कि मैंने 'पॉलीफिट' दिनचर्या को याद रखने के बजाय एक अनावश्यक जटिल उदाहरण लिखा है! – Chris

17

आप अपने डेटा में जो भी काम (कारण के भीतर) फिट करने के लिए scipy.optimize.curve_fit का उपयोग कर सकते हैं। इस समारोह के हस्ताक्षर

curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw) 

है और यह डेटा ydata(xdata) करने के लिए एक समारोह f फिट करने के लिए फिटिंग गैर रेखीय कम से कम वर्गों का उपयोग करता है।

import numpy 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 

def _polynomial(x, *p): 
    """Polynomial fitting function of arbitrary degree.""" 
    poly = 0. 
    for i, n in enumerate(p): 
     poly += n * x**i 
    return poly 

# Define some test data: 
x = numpy.linspace(0., numpy.pi) 
y = numpy.cos(x) + 0.05 * numpy.random.normal(size=len(x)) 

# p0 is the initial guess for the fitting coefficients, set the length 
# of this to be the order of the polynomial you want to fit. Here I 
# have set all the initial guesses to 1., you may have a better idea of 
# what values to expect based on your data. 
p0 = numpy.ones(6,) 

coeff, var_matrix = curve_fit(_polynomial, x, y, p0=p0) 

yfit = [_polynomial(xx, *tuple(coeff)) for xx in x] # I'm sure there is a better 
                # way of doing this 

plt.plot(x, y, label='Test data') 
plt.plot(x, yfit, label='fitted data') 

plt.show() 

जो आप की तरह कुछ देना चाहिए:

enter image description here

+0

आप का उपयोग 'yfit = _polynomial (xx, * coeff)', यह भी ध्यान दें कि p0 एक 0 डिग्री बहुपद के लिए, 1 के कम से कम लंबाई होना चाहिए कर सकते हैं। – martijnn2008

संबंधित मुद्दे