5

मैं scipy.optimize.curve_fit का उपयोग कर रहा हूं, लेकिन मुझे संदेह है कि यह स्थानीय न्यूनतम में परिवर्तित हो रहा है, न कि वैश्विक न्यूनतम।SciPy वैश्विक न्यूनतम वक्र फिट

मैं निम्नलिखित तरीके से सिमुलेटेड एनिलिंग उपयोग करने की कोशिश:

def fit(params): 
return np.sum((ydata - specf(xdata,*params))**2) 

p = scipy.optimize.anneal(fit,[1000,1E-10]) 

जहां specf वक्र मैं फिट करने की कोशिश कर रहा हूँ। p में परिणाम curve_fit द्वारा लौटाए गए न्यूनतम से स्पष्ट रूप से बदतर हैं, भले ही वापसी मूल्य इंगित करता है कि वैश्विक न्यूनतम पहुंच गया था (see anneal)।

मैं परिणामों को कैसे सुधार सकता हूं? क्या SciPy में एक वैश्विक वक्र फिटर है?

उत्तर

4

आप सही हैं, यह केवल स्थानीय न्यूनतम (जब यह अभिसरण) की ओर जाता है क्योंकि यह लेवेनबर्ग-मार्क्वार्ट एल्गोरिदम का उपयोग करता है। SciPy में कोई वैश्विक वक्र फिटर नहीं है, आपको existing global optimizers का उपयोग करके खुद को लिखना होगा। लेकिन सावधान रहें, कि आपको अभी भी उस मूल्य को अभिसरण करने की आवश्यकता नहीं है जिसे आप चाहते हैं। ज्यादातर मामलों में impossible है।

आपके परिणाम को बेहतर बनाने का एकमात्र तरीका शुरुआती पैरामीटर का अनुमान लगाने के लिए है।

+0

उत्तर के लिए धन्यवाद। मुझे वैश्विक अनुकूलन में परेशानी का एहसास है, लेकिन मैं अनुमान लगा रहा हूं (उम्मीद कर रहा हूं) कि यह समोच्च अपेक्षाकृत अच्छी तरह से व्यवहार किया जाता है। फिटनेस को मापने के लिए एल 2 मानक का उपयोग करने में मेरा दृष्टिकोण सही है? – Gus

3

आप leastsq() का उपयोग करने का प्रयास करना चाहेंगे (curve_fit वास्तव में इसका उपयोग करता है, लेकिन आपको पूर्ण आउटपुट नहीं मिलता है) या curve_fit के बजाय ODR package

leastsq() का पूरा आउटपुट आपको बहुत अधिक जानकारी देता है, जैसे कि छिद्रित मूल्य (यदि आप इसे फिट टेस्ट की त्वरित और गंदे भलाई के रूप में उपयोग करना चाहते हैं)।

आप फिट तो आप सिर्फ इस तरह से है कि यह कर सकते हैं वजन करने के लिए की जरूरत है:

fitfunc = lambda p,x: p[0]+ p[1]*exp(-x) 
errfunc = lambda p, x, y, xerr: (y-fitfunc(p,x))/xerr 
out = leastsq(errfunc, pinit, args=(x,y, xerr), full_output=1) 
chisq=sum(infodict['fvec']*infodict['fvec']) 
1

यह एक nontrivial समस्या है। क्या आपने विकासवादी रणनीतियों का उपयोग करने पर विचार किया है? मुझे ecspy के साथ बड़ी सफलता मिली है (http://code.google.com/p/ecspy/ देखें) और समुदाय छोटा है लेकिन बहुत उपयोगी है।