2013-10-03 11 views
30

मेरे पास कुछ बिंदु हैं और मैं इस बिंदु के लिए वक्र फिट करने की कोशिश कर रहा हूं। मुझे पता है कि scipy.optimize.curve_fit फ़ंक्शन मौजूद है, लेकिन मुझे दस्तावेज़ को समझ में नहीं आता है, यानी इस फ़ंक्शन का उपयोग कैसे करें।पायथन numpy/scipy वक्र फिटिंग

मेरे अंक: np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

किसी को भी ऐसा करने के लिए तरीके की व्याख्या कर सकते हैं?

+0

आप किस तरह का वक्र फिट करना चाहते हैं? बहुपद? – jabaldonedo

+0

हां, बहुपद – Bob

+0

तो मेरे उत्तर पर नज़र डालें, numpy – jabaldonedo

उत्तर

58

मैं सुझाव है कि आप सरल बहुपद फिट के साथ शुरू करने के लिए एक समारोह f है कि आप अंक का एक सेट करने के लिए पता होना चाहिए फिट करने के लिए scipy.optimize.curve_fit की कोशिश करता।

यह एक साधारण 3 डिग्री बहुपद numpy.polyfit और poly1d का उपयोग कर फिट है, पहले एक कम से कम वर्गों बहुपद फिट करता है और दूसरी नई अंक गणना करता है:

import numpy as np 
import matplotlib.pyplot as plt 

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)]) 
# get x and y vectors 
x = points[:,0] 
y = points[:,1] 

# calculate polynomial 
z = np.polyfit(x, y, 3) 
f = np.poly1d(z) 

# calculate new x's and y's 
x_new = np.linspace(x[0], x[-1], 50) 
y_new = f(x_new) 

plt.plot(x,y,'o', x_new, y_new) 
plt.xlim([x[0]-1, x[-1] + 1 ]) 
plt.show() 

enter image description here

+0

यह केवल दिए गए डेटासेट के साथ काम करता है।लेकिन जब मैं अंक बदलता हूं, तो अधिकांश मामलों में केवल दो बिंदुओं के बीच वक्र होता है। क्यूं कर? – Dmitri

+0

यह तब तक किसी भी डेटासेट के साथ काम करता है जब तक आप डेटा सही तरीके से प्रदान करते हैं, यह एक ही आकार के दो सरणी हैं, उदाहरण के लिए: 'x = np.array ([1, 2, 3, 4, 5, 6]) 'और 'y = np.array ([0.2, 1, 1.2, 3, 0.8, 1.1])' – jabaldonedo

+0

यह निम्नलिखित डेटासेट के साथ केवल दो पंक्तियों के बीच वक्र खींचता है: x = np.array ([0।, 1., - 1., .5]) वाई = एनपी.एरे ([0।, 1., .9, .7]) – Dmitri

37

आपको पहले अपने numpy सरणी को दो अलग-अलग सरणी में एक्स और वाई मानों को अलग करने की आवश्यकता होगी।

x = [1, 2, 3, 9] 
y = [1, 4, 1, 3] 

curve_fit को एक ऐसा फ़ंक्शन भी चाहिए जो आपके इच्छित फिट प्रकार प्रदान करता हो। उदाहरण के लिए, एक रेखीय फिट की तरह

def func(x, a, b): 
    return a*x + b 

scipy.optimize.curve_fit(func, x, y) एक समारोह का प्रयोग करेंगे एक numpy सरणी दो सरणियों युक्त वापस आ जाएगी: पहला a और b के लिए मूल्यों में शामिल होंगे, जो आपके डेटा फिट है, और दूसरा सहप्रसरण हो जाएगा इष्टतम फिट पैरामीटर का।

यहां आपके द्वारा प्रदान किए गए डेटा के साथ एक रैखिक फिट के लिए एक उदाहरण दिया गया है।

import numpy as np 
from scipy.optimize import curve_fit 

x = np.array([1, 2, 3, 9]) 
y = np.array([1, 4, 1, 3]) 

def fit_func(x, a, b): 
    return a*x + b 

params = curve_fit(fit_func, x, y) 

[a, b] = params[0] 

इस कोड को वापस आ जाएगी a = 0.135483870968 और b = 1.74193548387

यहाँ अपने अंक और रैखिक फिट ... जो स्पष्ट रूप से एक बुरा एक है के साथ एक साजिश है, लेकिन आप जो कुछ भी प्रकार प्राप्त करने के लिए फिटिंग समारोह को बदल सकते हैं फिट आप चाहते हैं।

enter image description here

+0

का उपयोग करके सबसे आसान तरीका है क्या आप एक उदाहरण भी प्रदान कर सकते हैं? – Bob

5

अजगर वक्र ढाले पुस्तकालय pyeq2, बीएसडी लाइसेंस, Google Code Repository पर उपलब्ध है:

https://github.com/zunzun/pyeq2

यह समानांतर प्रोग्रामिंग और उपयोगकर्ता परिभाषित कार्यों सहित कई उदाहरणों के साथ आता है, और आप पर मुक्त करने के लिए ऑनलाइन यह कोशिश कर सकते हैं:

http://zunzun.com

मैं लेखक हूँ, इसलिए यदि आप किसी भी प्रश्न हैं, तो मुझे ईमेल सीधे का उपयोग कर ईमेल पता [email protected] - मैं आपकी मदद करने और उदाहरण के साथ चलने और चलाने के लिए अपनी पूरी कोशिश करूंगा।

+0

ज़ुनज़ुन लिंक नीचे है .... –

+2

मेरी दृष्टि साइट को चलाने के लिए बहुत खराब हो गई , हालांकि मैं अभी भी वर्तमान समय के लिए अपनी दाहिनी आंख से पढ़ सकता हूं। यदि आप अपने सर्वर पर मूल साइट कोड का उपयोग करना चाहते हैं, तो यह अब https://github.com/zunzun/zunzunsite3 (पायथन 3) या https://github.com/zunzun/zunzunsite (पायथन पर github पर है) 2)। –

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