2011-09-23 4 views
1

Scipy의 fmin search을 사용하여 일부 데이터에 대한 분포의 적합 가능성에 대한 로그를 계산합니다. I는 로그 우도를 최대화과 같이 매개 변수를 검색 FMIN를 사용하고 있습니다. (likelihood_calculator 데이터 및 매개 변수 값을 사용하여 각 데이터 포인트에 대한 확률 값의 배열을 뱉어)Scipy의 fmin은 때때로 inf에만 적용됩니다

j = fmin(lambda p:-sum(log(likelihood_calculator(data, p))), array([1.5]), full_output=True) 

우도가 0 인 매개 변수로 검색을 시작하면 loglikelihood는 -inf이므로 -sum은 inf입니다. 다음을 반환 FMIN 멀리 초기 매개 변수에서 실행해야하지만, 대신 통화의 최대 수에 대한 그 값에 스틱 :

In [268]: print j 
(array([ 1.5]), inf, 67, 200, 1) 

나는 이것이 아마 infs의 FMIN의 처리에 문제라고 생각하지만, 우리의 경우 우도 계산기를 제거하고 단지 0 직접, 우리는 더 나은 행동을 얻을 손 :

In [269]: i = fmin(lambda p: -sum(log(p)), array([0]), full_output=1) 
Warning: Maximum number of function evaluations has been exceeded. 

In [270]: i 
Out[270]: (array([ 3.16912650e+26]), -61.020668415892501, 100, 200, 1) 

우리가 fmin_bfgs를 사용하는 경우 우리가 그 제로가 수레 경우, 제로의 배열을 사용하는 경우, 또는이 같은 올바른 동작이 발생합니다. fmin_bfgs를 사용하면 함수 호출과 동일한 잘못된 동작이 계속되지만 f 가능성은 0이 아니며 따라서 모든 infs를 반환하지 않는 매개 변수로 시작하면 fmin이 올바르게 작동합니다.

생각하십니까? 감사!

업데이트 :

제로 결과 매개 변수의 넓은 영역이 있다면

, 우리가 가장자리까지 매개 변수 값을 푸시 할 수 있습니다. 매개 변수가 가장자리 근처에 있으면 fmin이 zeroland에서 벗어나서 검색을 시작합니다. Ex. p < 1 = Inf, p = .99 fmin에서 작동하지만 p = .95에서는 작동하지 않음

답변

3

아마도 업데이트로 질문에 대답 할 수 있습니다. fmin은 내리막 경사 알고리즘을 사용하기 때문에 가장 가파른 하강 방향에 대한 초기 추측 근처를 검색합니다. 함수가 항상 inf을 반환하는 매개 변수 영역으로 충분히 깊숙한 경우 알고리즘은 어느 방향으로 갈지 알 수 없습니다.

+0

그랬던 것처럼 보입니다. 배열의 데이터 포인트 중 일부만이 0을 반환하므로 (전체 sum을 inf로 설정합니다),이 대신에 sys.float_info.min으로 0을 설정합니다. 이는이 사용 사례에 대해 충분히 정확합니다. 이것은 데이터 포인트의 전체 배열이 'fmin'으로 검색 할 수있는 그라디언트가있는 일관성이없는 'inf' -sum (log (likelihood))'을 반환한다는 것을 의미했습니다. – jeffalstott

관련 문제