2017-12-05 6 views
1

scipy를 사용하여 Newton-CG 최소화 함수의 이상한 동작 : 목적 함수 계산을 호출 할 때마다 값을 출력하십시오. 나는 종종 미니멀라이저가 결국보고를 끝내는 것보다 낮은 값을 발견한다는 것을 알게됩니다. 예제 출력은 아래와 같습니다. "Iter"는 최소화 함수의 반복 수이고 "call"은 최소화 함수가 목적 함수 "J"의 계산을 호출 한 시간입니다. "dJ"는 J가 이전 호출에서 얼마나 변경되었는지입니다. "F"는 콜백 함수 'iternum'을 포함하여 모든 계산을 포함하는 객체 클래스 그러나scipy.optimize.minimize ('Newton-CG')는 항상 가장 낮은 목적 함수를 반환하지 않습니다

res=scipy.optimize.minimize(f.J,f.z,args=(F),tol=1.e-4,method='Newton-CG', \ 
jac=f.Jacobian,hessp=f.Hessian, callback=f.iternum) 

Iter 1 , call 30 J=3.73e+09 dJ=3.58e+09 
Iter 1 , call 31 J=1.78e+09 dJ=-1.95e+09 
Iter 1 , call 32 J=5.23e+08 dJ=-1.26e+09 
Iter 1 , call 33 J=1.76e+08 dJ=-3.47e+08 
Iter 1 , call 34 J=1.33e+08 dJ=-4.29e+07 
Iter 1 , call 35 J=1.44e+08 dJ=1.14e+07 
Iter 2 , call 36 J=1.42e+08 dJ=-1.85e+06 
Iter 2 , call 37 J=1.42e+08 dJ=5.19e+04 

res.fun = 1.42e+08 

가장 낮은 J 값이 실제로 + 08 1.33e되어 있습니다 때문에, 그 변수와 그 목적 함수 값이 반환되어야합니다. 다른 사람이 이것을 경험합니까? 아이디어?

+0

죄송합니다. 나는 J = 1.33e + 08의 적합성을 받아들이고 대신 이러한 매개 변수를 반환 할 것으로 예상했습니다. 나는 이것을 말할 수있는 글을 편집했다. – AstroBen

+1

솔루션이 경계/제약 조건을 충족시키지 못하거나 그라디언트를 계산하기 위해 함수가 호출 된 상황에서이 문제가 주로 발생했습니다. 그러나 귀하의 경우에는 적용되지 않습니다. – kazemakase

+0

지금은 간단히 if-then 문을 사용하여 목적 함수의 최상의 값을위한 매개 변수를 항상 저장합니다.이 매개 변수는 결국 자신을 반환합니다. 아직도, 꽤 성가신; 내가 그것을 버그라고 생각해야하고, scipy와 함께 깃대로 달리게하는지 궁금하게 생각한다. – AstroBen

답변

-1

가장 낮은 J 값은 실제로 1.33e + 08이므로 이러한 매개 변수와 그 목적 함수 값이 반환되어야합니다.

No. J의 최저값은 1.33e + 08이 아니며, 그 값에 해당하는 매개 변수는 수학적으로 유의하지 않습니다. 이것은 반환되어야하는 값이 아닙니다. 콜백 함수를 통해 로깅하면 행복을 가져다주지 않습니다.

Newton-CG와 같은 그래디언트 기반 최소화 프로세스는 함수의 로컬 최소값을 찾을 때 중지됩니다. 지역 최소값이 글로벌이라는 약속은 없습니다. 지역 최소값으로가는 도중 검색이 중지되는 최소값보다 낮은 값의 함수를 통과 할 가능성이 완전히 있습니다. 기능은 해당 지점에서 종료 조건을 충족하지 못하기 때문에 검색이 계속 진행되었으므로 지점이 로컬 최소값이 아니라고 판단되었습니다. 그러한 값을 되 돌리는 것은 함수가 심지어 그 지점에서 국부적으로 최소화되었다는 어떠한 증거도없이 "어이, 발견 된 임의의 함수 값, 작은 종류의 값"이라고 말할 것입니다. 이것은 최적화 방법으로 설계된 것이 아닙니다.

표시되는 주관적으로 작은 임의의 값을 잡는 대신 검색에서 전역 최소값을 찾지 못한 이유를 고려해야합니다. 어쩌면 변수가 잘못 조정되었을 수도 있습니다. 어쩌면 초기 점수가 좋지 않을 수도 있습니다. 어쩌면 많은 로컬 미니 마가 있으며 basinhopping 메소드를 사용하여 점프하고 선택할 수있는 방법을 시도해야합니다.