2015-08-31 9 views
5

बात यह है कि, मैं अपने उद्देश्यों के लिए फिटिंग प्रक्रिया के डिजाइन की कोशिश कर रहा हूं और शुरुआती मूल्यों के सामान्य अनुमानक के रूप में एससीआई के अंतरण विकास एल्गोरिदम का उपयोग करना चाहता हूं, जिसका उपयोग बेहतर फिटिंग के लिए एलएम एल्गोरिदम में किया जाएगा। जिस फ़ंक्शन को मैं DE के साथ छोटा करना चाहता हूं वह विश्लेषणात्मक रूप से परिभाषित गैर-रैखिक फ़ंक्शन और कुछ प्रयोगात्मक मानों के बीच कम से कम वर्ग है। जिस बिंदु पर मैं फंस गया वह फ़ंक्शन डिज़ाइन है। जैसा कि इसके उपरोक्त संदर्भ में कहा गया है: "फ़ंक्शन f (x, * args) में होना चाहिए, जहां x 1-डी सरणी के रूप में तर्क है और तर्क किसी भी अतिरिक्त निश्चित पैरामीटर की आवश्यकता है पूरी तरह से समारोह "Scipy, विभेदक विकास

कोड का एक बदसूरत उदाहरण जो मैं सिर्फ निदर्शी प्रयोजनों के लिए लिखा है निर्दिष्ट करने के लिए:

def func(x, *args): 
    """args[0] = x 
     args[1] = y""" 
    result = 0 
    for i in range(len(args[0][0])): 
     result += (x[0]*(args[0][0][i]**2) + x[1]*(args[0][0][i]) + x[2] - args[0][1][i])**2 
    return result**0.5 

if __name__ == '__main__': 
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)] 
    x = [0,1,2,3,4] 
    y = [i**2 for i in x] 
    args = (x, y) 
    result = differential_evolution(func, bounds, args=args) 
    print(func(bounds, args)) 

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

+0

परेशान के लिए खेद है हर कोई, लेकिन मैं इस कोड को काम करने के लिए (* facepalm *) बनाने के लिए ... –

+3

कि ठीक है, @Tierpot में कामयाब रहे, खुशी है कि आप यह पता लगा :) में आपका स्वागत है [ इसलिए]! चूंकि आपने समस्या हल कर ली है, कृपया या तो अपना प्रश्न हटाएं या अपना समाधान उत्तर के रूप में पोस्ट करें। धन्यवाद! – askewchan

+0

पोस्ट किया गया समाधान ^)) –

उत्तर

4

यह थोडा सीधा समाधान है जो विचार दिखाता है, कोड भी बहुत पाइथनिक नहीं है लेकिन सादगी के लिए मुझे लगता है कि यह काफी अच्छा है। ठीक है उदाहरण के रूप में हम समीकरण y = x^2 से प्राप्त डेटा के लिए एक प्रकार y = ax^2 + bx + c के समीकरण फिट करना चाहते हैं। यह स्पष्ट है कि पैरामीटर ए = 1 और बी, सी 0 के बराबर होना चाहिए। क्योंकि अलग-अलग विकास एल्गोरिदम को कम से कम एक फ़ंक्शन मिल जाता है, हम सामान्य समीकरण के विश्लेषणात्मक समाधान के रूट अर्थ स्क्वायर विचलन (फिर से, सादगी के लिए) का न्यूनतम भाग खोजना चाहते हैं (y = ax^2 + bx + c) दिए गए पैरामीटर (कुछ प्रारंभिक अनुमान प्रदान करना) बनाम "प्रयोगात्मक" डेटा बनाते हैं। तो, कोड के लिए:

from scipy.optimize import differential_evolution 

def func(parameters, *data): 

    #we have 3 parameters which will be passed as parameters and 
    #"experimental" x,y which will be passed as data 

    a,b,c = parameters 
    x,y = data 

    result = 0 

    for i in range(len(x)): 
     result += (a*x[i]**2 + b*x[i]+ c - y[i])**2 

    return result**0.5 

if __name__ == '__main__': 
    #initial guess for variation of parameters 
    #    a   b   c 
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)] 

    #producing "experimental" data 
    x = [i for i in range(6)] 
    y = [x**2 for x in x] 

    #packing "experimental" data into args 
    args = (x,y) 

    result = differential_evolution(func, bounds, args=args) 
    print(result.x) 
+0

कूल। इसे पोस्ट करने के लिए धन्यवाद। मैं बिल्कुल इसकी तलाश में था। – Umberto