Zuerst, lassen Sie mich sagen, dass ich Erfahrungen mit wissenschaftlicher Mathematik oder Statistiken fehlt - so könnte dies ein sehr bekanntes Problem sein, aber ich weiß nicht, wo ich anfangen soll.Maximieren Sie eine Funktion mit vielen Parametern (Python)
Ich habe eine Funktion f(x1, x2, ..., xn)
wo ich die x'ses erraten muss und den höchsten Wert für f
finden. Die Funktion hat die folgenden Eigenschaften:
die Gesamtzahl oder Parameter ist in der Regel etwa 40 bis 60, so dass ein Brute-Force-Ansatz ist nicht möglich.
die möglichen Werte für jeden x-Bereich 0,01-2,99
die Funktion ist stabil, was bedeutet, daß ein höherer Wert bedeutet, dass f die Vermutung für die Parameter besser ist, und vice versa.
Bisher habe ich eine ziemlich einfache Methode in Python implementiert. Es setzt zunächst alle Parameter auf 1, rät zufällig neue Werte und prüft, ob das f höher ist als vorher. Wenn nicht, rollen Sie zu den vorherigen Werten zurück. In einer Schleife mit 10.000 Iterationen scheint dies irgendwie zu funktionieren, aber das Ergebnis ist wahrscheinlich weit davon entfernt, perfekt zu sein.
Vorschläge, wie die Suche nach den optimalen Parametern verbessert werden kann, sind willkommen. Beim googeln dieses Problems kamen Dinge wie MCMC auf, aber das scheint eine sehr fortgeschrittene Methode zu sein und ich würde viel Zeit brauchen, um die Methode zu verstehen. Grundlegende Tipps oder Konzepte würden mir mehr als ausgearbeitete Methoden und Algorithmen helfen.
Willkommen bei SO! Ich bin sicher, es gibt eine formale Lösung für dieses Problem, aber meine erste Schätzung wäre ein Greedy-Algorithmus ... Für jede 'xn', finden Sie den Wert dieser' xn', die maximiert 'f', und wiederholen? Dies hängt jedoch von der Art von 'f' ab. Gedanken? –
Wissen Sie zufällig, ob die Funktion wenige Maxima hat oder ob es viel zu erwarten hat? Wenn es relativ wenige Maxima sind, könnten Sie versuchen [Gradientenabstieg] (http://en.wikipedia.org/wiki/Gradient_descent) –
Wenn Sie eine unbekannte Anzahl von Variablen an eine Funktion senden, würde ich vorschlagen, sie entweder in einem zu speichern Array, Liste oder Wörterbuch. Wahrscheinlich eine Liste für Ihren Fall. – Josh