2016-05-20 9 views
1

Also, ich habe die folgenden Daten, die ich in Python geplottet habe. Temperature vs. DayDie effizienteste Methode zur Rückgabe von Koeffizienten für eine Anpassung in Python zur Verwendung in anderen Sprachen?

Die Daten werden für einen erzwungenen Begriff in einem System von Differentialgleichungen eingegeben, mit denen ich arbeite. Daher muss ich diesen Daten eine kontinuierliche Funktion zuweisen, so dass ich mich nicht mit Stabilitätsproblemen befassen muss, die mit Unstetigkeiten einer schrittweisen Funktion einhergehen könnten. Leider ist es ein ziemlich großer Datensatz.

Ich versuche, mit einer angepassten Funktion zu enden, die möglich und nicht zu langwierig ist, um sie in Stan zu übersetzen, die Sprache, in der ich die Differentialgleichungen kodiere, also etwas in stückweiser Polynomform mit einem Maximum vorzog von nur ein paar Stücken, die ich manuell codieren kann.

Ich begann mit polyfit von numpy, die nicht sehr gut war. Die Verwendung von UnivariateSpline von scipy gab mir einen anständigen Anfall, aber es gab mir nicht etwas, das für die Übersetzung in Stan geeignet schien. Daher suchte ich nach Vorschlägen für andere Passagen, die ich ausprobieren könnte, um Funktionen zurückzugeben, die leichter in andere Sprachen übersetzt werden können? Betrachtet man die Form meiner Daten, gibt es eine periodische Spline-Anpassung, die nützlich sein könnte?

+0

Würde eine sinusförmige Anpassung funktionieren? –

+0

Eine rein sinusförmige Anpassung nicht. – potpie

+0

Vielleicht die FFT verwenden und die höheren Frequenzen loswerden? – Jaime

Antwort

0

Aus Richtung Feld, so scheint es, dass eine Anpassung der Summe oder Zusammensetzung mehrerer Sinusfunktionen beteiligt es sein könnte. Ex: sin (cos (2x)), sin (x) + 2cos (x) usw. Ich würde Wolfram Alpha, Mathematica verwenden oder Matlab Richtung Felder zu erstellen.

1

Die UnivariateSpline Objekt hat get_knots und get_coeffs Methoden. Sie geben Ihnen die Knoten und Koeffizienten der Anpassung in der B-Spline-Basis.

Ein alternativer, gleichwertiger Weg ist die Verwendung von splrep für die Anpassung (und splev für Auswertungen).

auf ein stückweises Polynom Darstellung verwenden PPoly.from_spline (überprüfen Sie die Dokumentation für die letztere für das genaue Format)

zu konvertieren, wenn Sie wollen, was eine Darstellung Fourierraum ist, Sie leastsq oder least_squares verwenden können. Es wäre wichtig, vernünftige Startwerte für NLSQ-Anpassungsparameter bereitzustellen. Zumindest würde ich von z.B. Max-zu-Max-Distanzschätzung für die Periode und Max-zu-Min-Schätzung für die Amplitude.

Wie immer bei nicht-linearer Anpassung, YMMV, aber.