2011-07-03 5 views
3

SciPy 함수 fmin_ncg의 경우 hessian과 gradient를 함수가 아닌 변수로 제공하는 방법이 있습니까?파이썬에서 헤센을 fmin_ncg로 지원하기

파이썬에서 일부 Matlab 코드를 다시 작성하려고합니다. 이 코드에는 최적화 루틴을 사용하여 일부 매개 변수를 데이터 세트에 맞추는 작업이 포함됩니다. 이렇게하려면 그라디언트와 헤센을 제공했습니다. 예컨대 매트랩 나는 이런 식으로 뭔가를 가지고 :

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

myFunc 반환 3 개 값 : 함수 평가, 그라데이션, 그리고 헤센.

그러나 파이썬에서 fmin_ncg의 경우 그라디언트와 헤센은 별도의 기능으로 제공되어야합니다.

내게 이것은 코드가 대형 데이터 세트를 거쳐야하므로 비효율적이며 함수, 그라데이션 및 헤센에 공통적 인 계산이 있습니다. 예 : 함수 과 그라데이션이 g(x) = a(x)*c(x), hessian이 h(x) = a(x)*d(x) ... Matlab에서 내가 a(x)을 계산할 수있는 곳을 한번 생각해 봅니다. 여기서는 파이썬으로이 세 번을 계산해야합니다.

fmin_ncg의 작동 방식이 잘못되었거나 해결 방법이 있습니까?

+2

try memoization –

답변

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

관련 문제