2017-11-28 7 views
1

SciPy에서 무차별 최적화를 시도하고 있습니다.scipy brute optimization에서 fmin에 최대 반복을 전달하는 방법

(SPO로 가져 scipy.optimize)

이 이 (self.minimize_this, rranges, full_output = 사실, 마무리 = spo.fmin가)

내 질문이 res_brute = spo.brute

입니다

: N 회 반복 후에 spo.fmin이 멈추는 지 어떻게 확인합니까? 나는 어떤 주장도 할 수없는 것처럼 보입니다.

답변

1

brute 그래서 기본 동작을 재정의, 최소화 기능에 추가 인수를 전달 할 수있는 옵션이 없습니다, 당신은 fmin의 래퍼를 만들어야합니다 래퍼에서 maxiter 인수를 설정합니다. 랩퍼는 finish 인수로 brute에 전달됩니다. 여기에이 할 수있는 방법은 예를 들어

, 우리는 구간 [0, 10]에

def func(x): 
    return np.cos(3*x) + 0.25*(x-5)**2 

의 최소를 원하는 가정, 우리는 4로 fmin의 반복의 최대 수를 제한하려면 (ipython 세션에서).

우선, 수입 :

In [102]: import numpy as np 

In [103]: from scipy.optimize import brute, fmin 

이 목적 함수를 정의 다음 finish 인수 람다 식을 사용

In [104]: def func(x): 
    ...:  return np.cos(3*x) + 0.25*(x-5)**2 
    ...: 

통화 brute. 람다 표현식은 full_output=Truemaxiter=4과 함께 인수를 fmin에 전달합니다. 여기서 결과가있어, 비교를 위해

In [110]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=4)) 
Warning: Maximum number of iterations has been exceeded. 
Out[110]: array([ 5.2325]) 

(. 대신 람다 식, 당신은 같은 일을 별도의 기능을 정의 할 수 있습니다) 때 maxiter=100 :

In [111]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=100)) 
Optimization terminated successfully. 
     Current function value: -0.986810 
     Iterations: 13 
     Function evaluations: 26 
Out[111]: array([ 5.2235498]) 

그리고 우리가 사용하지 않는 경우 람다 식 fmin에 대한 호출은 maxiter :

예상대로
In [112]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True)) 
Optimization terminated successfully. 
     Current function value: -0.986810 
     Iterations: 13 
     Function evaluations: 26 
Out[112]: array([ 5.2235498]) 

, 그 결과를 오버라이드하지 01,234,985,768,332,229,511와 동일:

In [113]: brute(func, [slice(0, 10, 0.1)]) 
Out[113]: array([ 5.2235498])