2017-01-10 2 views
1

私はscipy.optimizeのcurve_fitを使って関数を最適化しようとしています。ここに私のコードです。scipy_optimizeを使った最適化

import pandas as pd 
import numpy as np 
from scipy.optimize import curve_fit 

xdata = [row[0] for row in pd.read_excel("C:\\Users\\310967\\Desktop\\Scholar\\Wound Chelation Draft\\ChelationFiles.xlsx", sheetname="Case2Data",skiprows=0).as_matrix()] 
ydata = [row[1] for row in pd.read_excel("C:\\Users\\310967\\Desktop\\Scholar\\Wound Chelation Draft\\ChelationFiles.xlsx", sheetname="Case2Data",skiprows=0).as_matrix()] 
SF = [row[4] for row in pd.read_excel("C:\\Users\\310967\\Desktop\\Scholar\\Wound Chelation Draft\\ChelationFiles.xlsx", sheetname="Case2Data",skiprows=0).as_matrix()] 
uncertainty = [(np.sqrt(np.exp(np.log(a)**2)-1))*b for a,b in zip(SF, ydata)] 

Tau = [0,1,5,7] 



def func(x, I, E, ic1, ic2, ih1, ih2): 

    def iu(t): 
     return ((0.01295*np.exp(-0.645974*t))+(4.3688e-4*np.exp(-0.04251*t))+(5.642452e-5*np.exp(-0.00160863*t))) 

    def ic(t,tj): 
     if t > tj: 
      return ic1*np.exp(-0.693/ih1*(t-tj))+ic1*np.exp(-0.693/ih1*(t-tj)) 
     else: 
      return 0 

    def listofic(t): 
     list1 = [] 
     for tj in Tau: 
      list1.append(ic(t,tj)) 
     return list1 

    def Kj(tj): 
     return iu(tj+1)*(E-1)/(ic(1,0)-iu(tj+1)) 

    def listofKj(): 
     list2 = [] 
     for tj in Tau: 
      list2.append(Kj(tj)) 
     return list2 

    Kjs = listofKj() 

    def listofOneMinusKj(t): 
     list3 = [] 
     for a in Tau: 
      if t > a: 
       value = 1-Kj(a) 
      else: 
       value = 1 
      list3.append(value) 
     return list3 

    return (iu(x)*np.prod(listofOneMinusKj(x))+sum([a*b for a,b in zip(Kjs,listofic(x))]))*I 


popt, pcov = curve_fit(func, xdata, ydata, sigma=uncertainty) 
print(popt) 

私は上記のコードを実行すると、私はというエラーを取得し、「複数の要素を持つ配列の真理値があいまいです。(a.anyを使用)またはa.all()」。これは、関数listofOneMinusKj(t)の中の "if t> a"の部分を参照しています。

しかし、次のコードを実行すると、 "if t> a"があるにもかかわらず、コードが期待どおりに実行されます。上記のコードで何が問題になっているのだろうかと思いました。問題のこれらの種類をデバッグするの

import numpy as np 
Tau = [0,1,5,7] 

def func(x, I, E, ic1, ic2, ih1, ih2): 

    def iu(t): 
     return ((0.01295*np.exp(-0.645974*t))+(4.3688e-4*np.exp(-0.04251*t))+(5.642452e-5*np.exp(-0.00160863*t))) 

    def ic(t,tj): 
     if t > tj: 
      return ic1*np.exp(-0.693/ih1*(t-tj))+ic1*np.exp(-0.693/ih1*(t-tj)) 
     else: 
      return 0 

    def listofic(t): 
     list1 = [] 
     for tj in Tau: 
      list1.append(ic(t,tj)) 
     return list1 

    def Kj(tj): 
     return iu(tj+1)*(E-1)/(ic(1,0)-iu(tj+1)) 

    def listofKj(): 
     list2 = [] 
     for tj in Tau: 
      list2.append(Kj(tj)) 
     return list2 

    Kjs = listofKj() 

    def listofOneMinusKj(t): 
     list3 = [] 
     for a in Tau: 
      if t > a: 
       value = 1-Kj(a) 
      else: 
       value = 1 
      list3.append(value) 
     return list3 

    return (iu(x)*np.prod(listofOneMinusKj(x))+sum([a*b for a,b in zip(Kjs,listofic(x))]))*I 

print(func(1,400,12.5,0.99,0.01,0.55,10)) 
+0

ヒントとオフトピック:次のコードを使用すると、より「パイソン」な方法で、読みやすくなります。 'df = pd.read_csv(...)'; 'xdata = np.asarray(df.iloc [:、0])'など... 一般的に、numpyの変換とリストの理解の両方を混ぜないことをお勧めします。 –

+0

答えのどれがあなたを助けましたか?承認された回答としてマークしてください。不明な点がある場合はお気軽にお問い合わせください。 –

答えて

1

一つの方法は、にちょうどライン上のトレースバックポイントをimport pdb; pdb.set_trace()呪文を投げることです。コードを実行すると、ブレークポイントで停止し、さまざまなオブジェクトを対話的に探索してコードをステップ実行できます。ここでは、curve_fitによって呼び出されたときに、tまたはaのいずれかが数値配列であることがわかります。if array > another_arrayは実行できません。

+0

これは意味があります。私はこのための回避策を見つけることができませんでした。私はこれをどのようにすることができるか知っていますか?ありがとうございました。 – DPdl

2

Scipy Optimizes Curve Fitting Procedureは、xdataのフルベクトルを関数funcに渡そうとします。それをlistofOneMinusKjに渡します。

したがってt > a(またはx > aとして渡される)は、boolのベクトルを生成します。このエラーが発生し

「)(複数の要素を持つ配列の真理値が曖昧である(a.anyを使用)またはa.all。」

次のエラーがトリガされたよりlength > 1のベクトルが真であるかどうかをチェックすることができないからです。提案されているように、を使用して、tの値がaより大きいか、(t > a).all()をチェックして、tのすべての値が大きいかどうかを調べることができます。

+0

返信いただきありがとうございます。 t> a.any()またはt> a.all()に変更すると、 'int'オブジェクトに 'any'属性がないという属性エラーが発生します。 :( – DPdl

+0

@DPdl:tは長さ> 1のベクトルです。 'a'はTauという名前のリストから取ったint型です。 '(t> a).any() 'をチェックする必要があります。あなたはこれが何を意味するのかを知っています... –

+0

@DPdl私は答えを更新しました、おそらく今はっきりしています。 –

関連する問題