2011-07-03 5 views
3

SciPy関数fmin_ncgについては、関数ではなく変数としてhessianとgradientを提供する方法がありますか?Pythonのheminianをfmin_ncgに補完する

私はいくつかのMatlabコードをPythonで書き直そうとしています。このコードでは、最適化ルーチンを使用していくつかのパラメータを一連のデータに適合させます。これを行うために、私はグラデーションとヘッセ行列を提供しました。

fmincon(@myFunc,x0,[],[],[],[],lb,ub,[],options); 

どこmyFunc戻り値3:機能評価、勾配、およびヘッセ例えばMATLABでは、私はこのような何かを持っています。

しかし、Pythonではfmin_ncgの場合、グラニュアントとヘッセンは別々の機能として提供する必要があるようです。

私にとっては、コードが大規模なデータセットを通過する必要があり、関数、グラデーション、ヘッセ行列に共通の計算があるので、これは非効率的です。例えば関数f(x) = a(x)*b(x)のグラデーションを想像してg(x) = a(x)*c(x)、hessian h(x) = a(x)*d(x) ... Matlabでa(x)を計算することができます。ここでは、この3回の計算をPythonで行う必要があります。

fmin_ncgがどのように機能するのか誤解しましたか?

+2

試してみてください。 –

答えて

4

すべての機能を含むクラスを作成できます。各反復では、共通変数は最初の関数呼び出しの間に計算され、その後、他の呼び出しのために再利用されます。 fmin_ncgというコールバック機能を使用して、各繰り返しの最後に共通変数をリセットすることができます。

class function(object): 

    def __init__(self): 
     self.commonVarsDirty = True 

    def calcFunction(self,x,*args,**kwargs): 
     if self.commonVarsDirty: 
     self.calcCommonVars() 
     return self.a*b 

    def calcGradient(self,x,*args,**kwargs): 
     if self.commonVarsDirty: 
     self.calcCommonVars() 
     return self.a*c 

    def calcHessian(self,x,*args,**kwargs): 
     if self.commonVarsDirty: 
     self.calcCommonVars() 
     return self.a*d 

    def resetCommonVars(self,*args,**kwargs): 
     self.commonVarsDirty = True 

    def calcCommonVars(self): 
     self.commonVarsDirty = False 
     # calculate common variables and save them as class attributes 
     self.a = 1+1 

このように使用します。

f = function() 
fmin_ncg(f.calcFunction,x0,f.calcGradient,fhess=f.calcHessian,callback=f.resetCommonVars) 

これは、共通変数を計算するための計算の労力が重要な場合にのみ、オーバーヘッドを追加するために役立ちます。

+0

すごくいいですよ。ありがとうBellamyjとDavid – Keith