2017-09-04 1 views
1

Je cours un code d'optimisation imbriqué.Même résultat d'optimisation du code d'optimisation sur différents ordinateurs

sp.optimize.minimize(fun=A, x0=D, method="SLSQP", bounds=(E), constraints=({'type':'eq','fun':constrains}), options={'disp': True, 'maxiter':100, 'ftol':1e-05}) 

sp.optimize.minimize(fun=B, x0=C, method="Nelder-Mead", options={'disp': True}) 

La première minimisation est la partie de la fonction B, donc elle est en quelque sorte exécutée dans la seconde minimisation.

Et toute l'optimisation est basée sur les données, il n'y a pas de nombre aléatoire impliqué. Je cours exactement le même code sur deux ordinateurs différents, et obtient des résultats totalement différents.

J'ai installé différentes versions de Anaconda, mais

scipy, numpy, et tous les emballages utilisés ont les mêmes versions.

Je ne pense pas vraiment OS importerait, mais est Windows 10 (64 bits), et l'autre est Windows 8.1 (64 bits)

Je suis en train de comprendre ce qui pourrait être la cause.

Même si je n'ai pas indiqué toutes les options, si deux ordinateurs exécutent le même code, les résultats ne devraient-ils pas être les mêmes?

ou existe-t-il des options pour sp.optimize que les valeurs par défaut sont définies pour être différent d'un ordinateur à l'autre?

PS. Je regardais l'option "eps". Est-il possible que les valeurs par défaut de "eps" sont différentes sur ces ordinateurs?

+0

Y a-t-il une différence dans la version Python? –

+0

Oh. tu as raison. J'ai manqué ceci .. L'un est Python 3.6.0 et l'autre est Python 3.6.1 Sera-ce la cause de la différence? Je veux dire .. C'est un peu frustrant, car sur un ordinateur il converge en 3000 itérations, mais sur l'autre, il ne converge pas avant 7000 itérations. – WKW

+0

Les deux instances Python 64 bits? Cela pourrait aussi être un facteur. Vérifiez que les tableaux chiffrés utilisent le même 'dtype' sur les deux instances. –

Répondre

0

Vous ne devriez jamais vous attendre à ce que les méthodes numériques fonctionnent de manière identique sur différents périphériques; ou même des courses différentes du même code sur le même appareil. En raison de la précision finie de la machine, vous ne pouvez jamais calculer le "vrai" résultat, mais seulement des approximations numériques. Au cours d'une longue tâche d'optimisation, ces différences peuvent se résumer. En outre, certaines méthodes d'optimazion utilisent une sorte de caractère aléatoire à l'intérieur pour résoudre le problème d'être coincé dans les minima locaux: ils ajoutent un petit bruit de fuite quasi nul à la solution calculée précédente pour permettre à l'algorithme de converger plus rapidement. minimum global et ne pas être coincé dans un minimum local ou un point de selle.

Pouvez-vous essayer de tracer le paysage de la fonction que vous voulez minimiser? Cela peut vous aider à analyser le problème: Si les deux résultats (sur chaque machine) sont des minima locaux, ce comportement peut être expliqué par ma description précédente.

Si ce n'est pas le cas, vous devez vérifier la version de scipy que vous avez installée sur les deux machines. Peut-être que vous utilisez implicitement les valeurs float sur un périphérique et les valeurs double sur l'autre également?

Vous voyez: il y a beaucoup d'explications possibles pour ce comportement numérique étrange (au premier coup d'oeil); vous devez nous donner plus de détails pour résoudre cela.

+0

Tout d'abord, merci pour la réponse! Mais j'ai obtenu les mêmes résultats sur le même ordinateur plusieurs fois. Et je ai juste essayé sur l'autre ordinateur, et obtenu des résultats différents et un peu surpris .. Je voudrais vraiment que je pourrais simplement télécharger mon code, mais je pense que je ne devrais pas .. :( Pourriez-vous être très gentil et En savoir plus sur "implicitement en utilisant float et double" Cela a-t-il quelque chose à voir avec la précision de la machine? Comment puis-je vérifier cela? (les versions scipy sont les mêmes ..) – WKW

+0

@WonkiWoo Essayez de tracer l'espace de la fonction que vous voulez minimiser, comme je vous l'ai dit. – FlashTek