2017-05-30 2 views
0

Bis jetzt verstehe ich die Minimieren-Funktion mit der Methode Trust-NCG, der "methodenspezifische" Parameter "max_trust_radius" ist der maximale Wert für eine neue Schrittoptimierung. Allerdings erlebe ich ein seltsames Verhalten. Ich arbeite in meinem Doktor Daten, und ich habe einen Code, die Funktion aufruft minimieren (mit Vertrauen NCG-Methode) Gabe von ParameternMinimize-Funktion mit Trust-NCG-Methode schlägt einen Wert größer als Max_trust_radius

{ 
    'initial_trust_radius':0.1, 
    'max_trust_radius':1, 
    'eta':0.15, 
    'gtol':1e-5, 
    'disp': True 
} 

I minimieren aufrufe Funktion als:

res = minimize(bbox, x0, method='trust-ncg',jac=bbox_der, hess=bbox_hess,options=opt_par) 

wo

  • bbox ist eine Funktion zur Auswertung der Zielfunktion
  • x0 ist die anfängliche Vermutung
  • bbox_der die Gradientenfunktion
  • bbox_hess Hessian Funktion
  • opt_par ist das Wörterbuch mit den obigen Parametern ist.

Bbox ruft Simulationscode auf und ruft die Daten ab. Es funktioniert: minimiere hin und her, schlägt neue Werte vor, bbox ruft Simulation auf.

Alles funktioniert gut, bis ich ein seltsames Problem bekam. Der Vektor "x" enthält 8 Werte. Ich merke, dass eine der Iterationen, der letzte Wert größer als 1 ist. Per Max_trust_radius, ich denke, dass es weniger als 1 sein sollte, aber es ist 1.0621612802208713e + 00 Das Problem verursacht Probleme, weil Bbox den Wert nicht empfangen kann größer als 1, da es ein Simulationsprogramm aufruft und es eine Einschränkung gibt, dass es 1 oder mehr als 1 nicht empfangen kann.

Ich habe den scipy-Code gefunden und versucht zu sehen, ob ich einen Fehler oder etwas finden kann falsch, aber ich bin es nicht.

Meine Hauptanliegen sind:

  • Mein Verständnis ist, dass es ein Fehler in der scipy ist Code zu minimieren, da der neue Wert größer ist als max_trust_radius ist.

  • Wie kann ich die Werte manipulieren oder steuern, um zu vermeiden, dass Werte größer als 1 werden?

  • Schlägst du etwas vor, um das Problem zu untersuchen?

Antwort

0

Die max_trust_radius steuert, wie groß Schritte Sie nehmen dürfen:

max_trust_radius : float 
        Maximum value of the trust-region radius. 
        No steps that are longer than this value will be proposed. 

Da Sie sehr wahrscheinlich sind viele Schritte bei der Minimierung nehmen, die jeweils die Länge von bis zu 1 sein kann, es ist überhaupt nicht seltsam, dass Sie (||x0||=0 vorausgesetzt) ​​mit ||x|| > 1 enden.

Wenn Ihr Problem streng begrenzt ist, müssen Sie einen Optimierungsalgorithmus anwenden, der Grenzen für die Parameter unterstützt. Für scipy.optimize.minimize nur L-BFGS-B, TNC und SLSQP Methoden scheinen das Schlüsselwort bounds= zu unterstützen.

Verwandte Themen