2012-12-06 4 views
0

J'essaye de minimiser une fonction avec beaucoup de paramètres (un peu plus de 7000) en utilisant fmin_bfgs() ou fmin_l_bfgs_b(). Quand j'entrez la commandefmin_bfgs ne se termine pas

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

(où obj_f est la fonction que je suis en train de minimiser et Pars est le vecteur des paramètres initiaux), la fonction passe juste pour toujours jusqu'à ce que python me dit qu'il a de mettre fin au programme. Il n'y a jamais de sortie. J'ai essayé d'ajouter l'argument maxfunc = 2 pour voir si cela arrivait n'importe où et que la même chose arrivait (a fonctionné pour toujours alors python a terminé le programme). J'essaie juste de comprendre ce qui pourrait mal se passer avec la fonction. On dirait que c'est peut-être coincé dans une boucle ou quelque chose comme ça. est-ce que quelqu'un à rencontré ce problème? Sinon, je pourrais aussi utiliser une aide générale pour le débogage (car je suis relativement nouveau sur Python) sur la façon de surveiller ce que fait la fonction. Enfin, peut-être que quelqu'un peut recommander une fonction ou un package différent pour la tâche que j'essaye. J'essaie d'ajuster une régression de Poisson régularisée au lasso à des données éparses avec environ 12 millions d'observations de 7000 variables.

PS Désolé de ne pas inclure la fonction de probabilité -log que j'essaie de minimiser, mais ce serait complètement ininterprétable.

Merci beaucoup pour toute aide!

Zach

+0

7000 paramètres est beaucoup! La fmin essaye d'évaluer votre fonction pour des variations sur tous ceux-ci, et c'est probablement pourquoi cela prend si longtemps. Et sûrement avec 7000 variables, il y a probablement beaucoup de minima locaux. Ma suggestion serait d'essayer quelques PCA pour réduire la dimensionnalité du problème. – tiago

+0

C'est beaucoup! Mais il est totalement convexe donc pas de minima local ... – zss

Répondre

3

Puisque vous ne fournissez pas à gradients fmin_bfgs et fmin_l_bfgs_b, votre fonction objectif est évaluée len(x) > 7000 fois chaque fois que le gradient est nécessaire. Si la fonction objectif est lente à évaluer, cela s'additionnera.

L'option maxfun ne compte pas, semble-t-il, l'estimation du gradient, il est donc possible que ce ne soit pas une boucle infinie, mais que cela prenne beaucoup de temps. Que voulez-vous dire par "python m'indique qu'il doit terminer le programme"?

Veuillez dans tous les cas essayer de fournir un cas de test reproductible ici. Peu importe si la fonction objectif est incompréhensible --- ce qui est important est que les personnes intéressées peuvent reproduire la condition que vous rencontrez. Je ne vois pas de problème de boucle infinie sur mon système même pour 7000 paramètres. Cependant, le compte d'évaluation de la fonction était d'environ 200000 pour un simple problème 7000 avec l_bfgs_b et aucun gradient fourni. Faites le profil de votre code pour voir ce que cette évaluation signifie pour vous. Avec gradient fourni, il était de 35 (+ 35 fois le gradient). Fournir un gradient peut alors aider. (Si la fonction est compliquée, la différenciation automatique peut encore fonctionner --- il existe des bibliothèques pour cela en Python.)

Autres bibliothèques d'optimisation pour Python, voir: http://scipy.org/Topical_Software (ne peut pas dire qui sont les meilleurs, bien que --- IPOPT ou pièces de monnaie ou pourrait être la peine d'essayer)

Pour référence: L- BFGS-B est mise en œuvre dans Scipy celui-ci (et est écrit par les gars qui sont censés savoir ce qu'ils font): http://users.eecs.northwestern.edu/~nocedal/lbfgsb.html

*** 

Vous pouvez déboguer ce qui se passe par exemple en utilisant le débogueur Python pdb, python -m pdb your_script.py. Ou simplement en insérant des instructions d'impression à l'intérieur.

Essayez aussi Google "python debug" et "python profil";)

+0

Merci, je ne me suis pas rendu compte que maxfunc ne compte pas l'estimation de gradient. J'ai une fonction de dégradé que je peux fournir. C'est assez lent, mais il doit être plus rapide que l'approximation! – zss