Python-Kurven-Fit-Bibliothek, mit der ich den Parametern Grenzen zuweisen kann

8

Ich möchte in der Lage sein, Fits zu machen, die es mir erlauben, eine beliebige Kurvenfunktion an Daten anzupassen, und erlaubt mir, willkürliche Grenzen für Parameter festzulegen, zum Beispiel möchte ich Funktion anpassen:

%Vor%

und sagen:

  • a2 liegt im folgenden Bereich: (-1, 1)
  • a3 und a5 sind positiv

Es gibt eine nette scipy curve_fit Funktion, aber sie tut es nicht t erlauben, Parametergrenzen zu spezifizieren. Es gibt auch schöne Ссылка Bibliothek, die generische Minimalisierung der Fall ist, und erlaubt es Grenzen für Parameter einzustellen, aber in meinem Fall ist es hat nicht gedeckt.

    
jb. 26.05.2013, 15:34
quelle

6 Antworten

8

Hinweis: Neu in Version 0.17 von SciPy

Nehmen wir an, Sie möchten ein Modell an die Daten anpassen, die so aussehen:

%Vor%

und mit der Einschränkung für Alpha

%Vor%

während die anderen Parameter a und b frei bleiben. Dann sollten wir die Option bounds von curve_fit wie folgt verwenden:

%Vor%

Quelle ist hier .

    
Mohit Pandey 01.08.2016, 21:49
quelle
3

Abhilfe: Verwenden Sie Variablentransformationen wie a2 = tanh (a2 '), a3 = exp (a3') oder a5 = a5 '^ 2.

    
Joachim W 26.05.2013 15:45
quelle
3

Wie bereits von Rob Falck erwähnt, könnten Sie zum Beispiel die scipy nichtlinearen Optimierungsroutinen in scipy.minimize minimieren eine beliebige Fehlerfunktion, z der mittlere quadratische Fehler.

Beachten Sie, dass die von Ihnen angegebene Funktion nicht unbedingt echte Werte hat - vielleicht war dies der Grund dafür, dass Ihre Minimierung in pyminuit nicht konvergierte. Sie müssen dies etwas genauer behandeln, siehe Beispiel 2.

Die folgenden Beispiele verwenden beide die Minimierungsmethode L-BFGS-B , die begrenzte Parameterbereiche unterstützt. Ich teile diese Antwort in zwei Teile:

  1. Eine Funktion mit echtem codomain, ähnlich der von Ihnen gegebenen. Ich habe absolute Werte hinzugefügt, um sicherzustellen, dass die von Ihnen angegebene Funktion reelle Zahlen in der Domäne [-3,3)
  2. zurückgibt
  3. Die eigentliche Funktion, die Sie gegeben haben, die einen komplexen codomain
  4. hat

1. Echter Kabeljau

Das folgende Beispiel zeigt die Optimierung dieser leicht modifizierten Version Ihrer Funktion.

%Vor%

2. Erweiterung auf komplexen Codomain

Die Erweiterung der obigen Minimierung auf die komplexe Domäne kann durch explizites Umwandeln in komplexe Zahlen und Anpassen der Fehlerfunktion erfolgen:

Zuerst wird der Wert x explizit in einen komplexwertigen Wert umgewandelt, um sicherzustellen, dass f komplexe Werte zurückgibt und Bruchzahlen von negativen Zahlen berechnet werden können. Zweitens berechnen wir eine Fehlerfunktion für Real- und Imaginärteile - ein einfacher Kandidat ist der Mittelwert der quadrierten komplexen Absolutwerte.

%Vor%

Notizen

Es sieht so aus, als ob der Minimizer ein wenig empfindlich auf Anfangswerte reagiert - deshalb habe ich meine erste Schätzung (p_init) nicht zu weit vom Optimum entfernt platziert. Sollten Sie damit zu kämpfen haben, können Sie den gleichen Minimierungsvorgang zusätzlich zu einer globalen Optimierungsschleife, z. Becken-Hopping oder Brute .

    
flinz 06.01.2015 12:55
quelle
3

Sie könnten lmfit für diese Art von Problemen verwenden. Daher füge ich ein Beispiel (mit einer anderen Funktion, als Sie verwenden, aber es kann leicht angepasst werden), wie Sie es verwenden, falls jemand auch an diesem Thema interessiert ist.

Nehmen wir an, Sie haben einen Datensatz wie folgt:

%Vor%

und Sie möchten ein Modell an die Daten anpassen, die wie folgt aussehen:

%Vor%

mit den Einschränkungen, dass

%Vor%

Mit lmfit (Version 0.8.3) erhalten Sie dann folgende Ausgabe:

%Vor%

Wie Sie sehen können, reproduziert die Anpassung die Daten sehr gut und die Parameter sind in den gewünschten Bereichen.

Hier ist der gesamte Code, der das Diagramm mit einigen zusätzlichen Kommentaren reproduziert:

%Vor%

BEARBEITEN:

Wenn Sie Version 0.9.x verwenden, müssen Sie den Code entsprechend anpassen. schau hier nach, welche Änderungen von 0.8.3 auf 0.9.x vorgenommen wurden .

    
Cleb 05.12.2015 11:59
quelle
2

Eine Python-Bibliothek (BSD-Lizenz), die dies tut, ist:

Ссылка

Sie können es online unter Ссылка

testen     
James Phillips 30.05.2013 13:58
quelle
1

Haben Sie daran gedacht, es als ein Optimierungsproblem zu behandeln und eine der nichtlinearen Optimierungsroutinen in scipy zu verwenden, um den Fehler der kleinsten Quadrate durch Variieren der Koeffizienten Ihrer Funktion zu minimieren? Viele der Optimierungsroutinen ermöglichen gebundene Einschränkungen für die unabhängigen Variablen.

    
Rob Falck 27.05.2013 15:23
quelle