2012-12-06 13 views
0

fmin_bfgs() 또는 fmin_l_bfgs_b()를 사용하여 많은 매개 변수 (7000 개 조금 넘음)가있는 함수를 최소화하려고합니다. 나는 (obj_f 내가 최소화하기 위해 노력하고있어 및 동위 초기 매개 변수의 벡터, 함수입니다) 파이썬은이 프로그램을 종료해야한다는 것을 알려줍니다 때까지 함수가 영원히 실행fmin_bfgs가 완료되지 않았습니다.

opt_pars = fmin_l_bfgs_b(obj_f, pars, approx_grad=1) 

명령을 입력합니다. 출력이 없습니다. 인수 maxfunc = 2를 추가하여 시도해 보았습니다.이 경우 아무 곳이나 가져 왔고 똑같은 일이 발생했는지 (영원히 계속 실행 한 다음 파이썬이 프로그램을 종료했습니다) 참조하십시오.

나는이 기능에 어떤 문제가 있는지 알아 내려고하고있다. while 루프 또는 무언가에 걸린 것 같습니다. 누구든지이 문제가 발생 했습니까? 그렇지 않다면 함수를 수행하는 방법을 모니터링하는 방법에 대한 일반적인 디버깅 도움말 (여기서는 필자가 Python을 처음 접했을 때)을 사용할 수도 있습니다.

마지막으로 누군가가 내가 시도하고있는 작업에 대해 다른 기능이나 패키지를 추천 할 수 있습니다. 나는 올가미의 규칙적인 포아송 회귀를 7000 개의 변수에 대한 1,200 만 관측치를 가진 데이터에 맞추려고합니다.

추신 : 죄송합니다 - 로그 우도 함수를 포함시키지 않으려 고 노력하고 있습니다 만 최소화하려고 노력하고 있지만 완전히 해석 할 수는 없습니다.

도움을 주셔서 감사합니다.

당신이 fmin_bfgsfmin_l_bfgs_b에 그라디언트를 제공하지 않기 때문에 자크가

+0

7000 매개 변수가 많이있다)

또한 구글 "디버그 파이썬"와 "프로필 파이썬"을 시도! fmin은 그 모두에 대한 변형에 대한 함수를 평가하려고 시도하고 있으며, 아마도 그렇게 오래 걸리는 이유 일 것입니다. 그리고 분명히 7000 개의 변수가 있으면 많은 로컬 미니 마가있을 것입니다. 내 제안은 문제의 차원을 줄이기 위해 일부 PCA를 시도하는 것입니다. – tiago

+0

많이 있습니다! 하지만 완전히 볼록 해져서 로컬 미니 마커가 없어졌습니다. – zss

답변

3

, 당신의 목적 함수가 len(x) > 7000 배 그라데이션이 필요할 때마다 평가됩니다. 목적 함수가 평가하기가 느리다면, 그것은 더할 것입니다.

maxfun 옵션은 분명히 그래디언트 추정을 계산하지 않으므로 실제로는 무한 루프가 아니며 매우 오랜 시간이 걸릴 수도 있습니다.

"파이썬이 프로그램을 종료해야한다고 알려줍니다."라는게 무슨 뜻입니까?

여기에 재현 가능한 테스트 케이스를 제공하십시오. 목적 함수가 이해할 수 없다면 중요하지 않습니다. 무엇이 입니다. 관심있는 사람들은 당신이 만나는 상태를 재현 할 수 있습니다.

7000 개의 매개 변수에 대해서도 시스템에서 무한 루프 문제가 발생하지 않습니다. 그러나 7000- 매개 변수의 경우 l_bfgs_b에 대한 함수 평가 계수는 약 200000이며 그라디언트는 제공되지 않습니다. 그러한 평가가 의미하는 바를 알아 보려면 코드를 프로파일하십시오. 그라디언트를 제공하면 35 (그라디언트의 35 배)입니다. 그래디언트를 제공하면 도움이 될 수 있습니다. (함수가 복잡하다면 자동 차별화가 여전히 작동 할 수 있습니다. 파이썬에서 라이브러리를 사용할 수 있습니다.)

파이썬에 대한

다른 최적화 라이브러리 , 참조 : http://scipy.org/Topical_Software는 (가장 좋은 사람되는 말할 수 없다,하지만 --- ipopt 또는 동전 또는 수의 가치 시도를) 참고로

을 다음 L-를 Scipy에서 BFGS-B의 구현은 하나입니다 (그들이 무엇을하고 있는지 알고 해야하는 사람에 의해 작성된 것입니다) : http://users.eecs.northwestern.edu/~nocedal/lbfgsb.html

*** 

당신은 예에 무슨 일이 일어나고 있는지 디버깅 할 수 있습니다 파이썬 디버거 pdb, python -m pdb your_script.py을 사용하여. 또는 내부에 print 문을 삽입하십시오.

+0

감사합니다. maxfunc가 기울기 추정을 계산하지 않는다는 것을 알았습니다. 내가 제공 할 수있는 그래디언트 함수가 있습니다. 그것은 그 자체로 꽤 느리지 만, 근사값보다 빠를 것입니다! – zss

관련 문제