2016-12-19 8 views
2

データセットに合わせてn個の変数の関数を定義しようとしています。関数は次のようになります。配列をパラメータとして持つPythonラムダ関数

Kelly Function

私は、ここでは、これまでに私のコードですscipy.optimize.leastsq

を使用して、私のデータセットに合わせて、最適なAIのとBJさんを見つけたいです。それは私にエラーを与えている瞬間

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:あまりにも多くの指標」なぜなら私はのparams [0 ,:]とのparams [1で私の最初のラムダ関数を定義した方法の,: ]。

+1

あなたは 'params [0、:]'と 'params [1、:]'で何をしようとしていますか?それは有効なPythonリストスライス構文のようには見えません。 – Ben

+3

これは実際には有効なPythonです。キーはタプルで、タプルの2番目の要素はスライスです。それはNumPyによって広く使用されています。 – kindall

+0

私は訂正しました!説明をありがとう。 – Ben

答えて

0

私は完全な答えを書くことができるあなたのアプローチにはいくつかの問題があります。

具体的な質問として、leastsqは多次元配列をパラメータ入力として実際には期待していません。ドキュメンテーションはこれを明確にしていませんが、目的関数に渡すとパラメータ入力は平らになります。あなたは、フル機能の代わりに、ラムダを使用してこれを確認することができます。

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の呼び出しは、この事実を示すためだけにあります。コードを実行するためには必要ありません(また、各繰り返しで不必要な出力を生成します)。

他のエラーに関連するその他の変更を参照してください:理由がないため、kellyFunca=[a]b=[b]がありました。これは入力配列を配列を含むリストに変換し、次のループは意図したものとはまったく異なるものになりました。

最後に、sneakiestエラー:あなたは、xという名前の入力変数を持つfitKellyy、あなたはxを使用してyは、リスト内包のループ変数です。これはPython 3で期待されるようにしか動作しません。 Python 2では、リスト内包の内部変数は、実際には外側のスコープの外に漏れ、入力変数xyを上書きします。

+1

ありがとうございました!ええ、そこから愚かなエラーが残っていました。 –

+0

@AdamLeinweber私は助けることができてうれしいです。私の答えがあなたの問題を解決し、あなたがそれに満足しているなら、[それを受け入れるとマークする]ことを検討してください(http://stackoverflow.com/help/accepted-answer)。 –

関連する問題