2016-12-19 23 views
2

我想要定義一個n變量的函數來適合數據集。該功能看起來像這樣。以數組爲參數的Python lambda函數

Kelly Function

我再要找到最佳的艾未未和BJ的適合我的數據使用scipy.optimize.leastsq

在此處設置是到目前爲止我的代碼。

from scipy.optimize import leastsq 
import numpy as np 

def kellyFunc(a, b, x): #Function to fit. 
    top = 0 
    bot = 0 
    a = [a] 
    b = [b] 
    for i in range(len(a)): 
    top = top + a[i]*x**(2*i) 
    bot = bot + b[i]*x**(2*i) 
    return(top/bot) 


def fitKelly(x, y, n): 
    line = lambda params, x : kellyFunc(params[0,:], params[1,:], x) #Lambda Function to minimize 
    error = lambda params, x, y : line(params, x) - y #Kelly - dataset 

    paramsInit = [[1 for x in range(n)] for y in range(2)] #define all ai and bi = 1 for initial guess 

    paramsFin, success = leastsq(error, paramsInit, args = (x,y)) #run leastsq optimization 

    #line of best fit 
    xx = np.linspace(x.min(), x.max(), 100) 
    yy = line(paramsFin, xx) 

    return(paramsFin, xx, yy) 

在它給我的錯誤的時刻:
「IndexError:太多的指標」,因爲我已經定義了我最初的lambda函數使用參數[0 ,:],而params [1的方式,: ]。

+1

你想用'params [0,:]'和'params [1,:]'做什麼?這看起來不像有效的Python列表切片語法。 – Ben

+3

實際上,這是有效的Python。關鍵是一個元組,元組的第二個元素是一個片。它被NumPy廣泛使用。 – kindall

+0

我站好了!感謝您的澄清。 – Ben

回答

0

你的方法有幾個問題,使我寫一個完整的答案。

至於你的具體問題:leastsq並不真正期望多維數組作爲參數輸入。文檔沒有說明這一點,但參數輸入在傳遞到目標函數時變平。您可以使用,而不是lambda表達式全功能驗證這一點:

from scipy.optimize import leastsq   
import numpy as np 

def kellyFunc(a, b, x): #Function to fit. 
    top = 0 
    bot = 0 
    for i in range(len(a)): 
    top = top + a[i]*x**(2*i) 
    bot = bot + b[i]*x**(2*i) 
    return(top/bot) 

def line(params,x): 
    print(repr(params)) # params is 1d! 
    params = params.reshape(2,-1) # need to reshape back 
    return kellyFunc(params[0,:], params[1,:], x) 

def error(params,x,y): 
    print(repr(params)) # params is 1d! 
    return line(params, x) - y # pass it on, reshape in line() 

def fitKelly(x, y, n): 
    #paramsInit = [[1 for x in range(n)] for y in range(2)] #define all ai and bi = 1 for initial guess 
    paramsInit = np.ones((n,2)) #better 
    paramsFin, success = leastsq(error, paramsInit, args = (x,y)) #run leastsq optimization 

    #line of best fit 
    xx = np.linspace(x.min(), x.max(), 100) 
    yy = line(paramsFin, xx) 

    return(paramsFin, xx, yy) 

現在,正如你看到的,params陣列的形狀是(2*n,)而不是(2,n)。通過自己重新重塑,你的代碼(幾乎)可以工作。當然,print電話只是爲了向你顯示這個事實;他們不需要代碼運行(並且會在每次迭代中產生大量不必要的輸出)。

查看我的其他更改,與其他錯誤相關:您的和b=[b]在您的kellyFunc中,原因不明。這將輸入數組轉換爲包含數組的列表,這使得下一個循環做了與您所期望的完全不同的事情。

最後,sneakiest錯誤:您有一個名爲x輸入變量,yfitKelly,那麼你用xy是在列表理解循環變量。請注意,這隻適用於python 3;在Python 2中,列表推導的內部變量實際上泄漏到外部作用域之外,覆蓋名爲xy的輸入變量。

+1

非常感謝!是啊,有幾個愚蠢的錯誤留在那裏從我亂搞它ahaha非常感謝! –

+0

@AdamLeinweber我很高興我能幫上忙。如果我的答案解決了您的問題,並且您對此感到滿意,請考慮[將其標記爲已接受](http://stackoverflow.com/help/accepted-answer)。 –