Was soll ich tun, wenn ich 3D Spline / Glatt Interpolation von zufälligen unstrukturierten Daten haben möchte?

9

Ich wurde von dieser Antwort von @James inspiriert, um zu sehen, wie griddata und map_coordinates verwendet werden könnten. In den folgenden Beispielen zeige ich 2D Daten, aber mein Interesse ist in 3D. Ich habe festgestellt, dass griddata nur Splines für 1D und 2D liefert und auf lineare Interpolation für 3D und höher beschränkt ist (wahrscheinlich aus sehr guten Gründen). Map_coordinates scheint jedoch mit 3D in Ordnung zu sein, indem eine Interpolation höherer Ordnung (glatter als stückweise linear) verwendet wird.

Meine primäre Frage: Wenn ich zufällige, unstrukturierte Daten (in denen ich keine map_koordinates verwenden kann) in 3D habe, gibt es eine Möglichkeit, eine glattere als stückweise lineare Interpolation innerhalb des NumPy SciPy-Universums zu erhalten oder zumindest in der Nähe?

Meine zweite Frage: Ist Spline für 3D in griddata nicht verfügbar, weil es schwierig oder langwierig ist, es zu implementieren, oder gibt es eine grundlegende Schwierigkeit?

Die Bilder und der schreckliche Python unten zeigen mein aktuelles Verständnis darüber, wie Griddata und Map_Coordinates verwendet werden können oder nicht. Die Interpolation erfolgt entlang der dicken schwarzen Linie.

STRUKTURIERTE DATEN:

UN STRUKTURIERTE DATEN:

Schrecklicher Python:

%Vor%     
uhoh 24.09.2015, 04:36
quelle

1 Antwort

10

Gute Frage! (und schöne Grundstücke!)

Bei unstrukturierten Daten sollten Sie zu Funktionen zurückkehren, die für unstrukturierte Daten gedacht sind. griddata ist eine Option, verwendet jedoch die Triangulation mit linearer Interpolation dazwischen. Dies führt zu "harten" Kanten an Dreiecksgrenzen.

Splines sind radiale Basisfunktionen. In scipy ausgedrückt möchten Sie scipy.interpolate.Rbf . Ich würde empfehlen, function="linear" oder function="thin_plate" über kubische Splines zu verwenden, aber kubisch ist auch verfügbar. (Kubische Splines werden Probleme mit "Überschwingen" im Vergleich zu linearen oder dünnen Splines verschärfen.)

Eine Einschränkung ist, dass diese spezielle Implementierung von radialen Basisfunktionen immer alle Punkte in Ihrem Datensatz verwendet. Dies ist der genaueste und glatteste Ansatz, aber er skaliert schlecht, wenn die Anzahl der Eingabe-Beobachtungspunkte zunimmt. Es gibt verschiedene Möglichkeiten, aber die Dinge werden komplexer. Ich werde das für eine andere Frage verlassen.

Jedenfalls, hier ist ein vereinfachtes Beispiel. Wir erzeugen zufällige Daten und interpolieren sie dann an Punkten, die sich auf einem regelmäßigen Gitter befinden. (Beachten Sie, dass sich die Eingabe nicht in einem regulären Raster befindet und die interpolierten Punkte auch nicht sein müssen.)

%Vor%

Wahl des Spline-Typs

Ich habe "thin_plate" als Typ des Splines gewählt. Unsere Eingabe-Beobachtungspunkte reichen von 0 bis 1 (sie werden von np.random.random erstellt). Beachten Sie, dass unsere interpolierten Werte etwas über 1 und deutlich unter Null liegen. Dies ist ein "Überschießen".

Lineare Splines verhindern vollständig das Überschießen, aber Sie werden mit "Bullseye" -Mustern enden (nicht annähernd so schwer wie bei IDW-Methoden). Zum Beispiel sind hier genau dieselben Daten interpoliert mit einer linearen radialen Basisfunktion. Beachten Sie, dass unsere interpolierten Werte nie über 1 oder unter 0 gehen:

Splines höherer Ordnung werden Trends in den Daten kontinuierlicher machen, werden aber mehr überstrahlen. Der Standardwert "multiquadric" ähnelt ziemlich einem Spline mit dünnen Platten, aber er wird die Dinge ein wenig kontinuierlicher machen und ein bisschen schlechter überschwingen:

Wenn Sie jedoch zu Splines höherer Ordnung gehen, z. B. "cubic" (dritte Ordnung):

und "quintic" (fünfte Ordnung)

Sie können wirklich unangemessene Ergebnisse erzielen, sobald Sie Ihre Eingabedaten etwas überschreiten.

Auf jeden Fall ist hier ein einfaches Beispiel, um verschiedene radiale Basisfunktionen in zufälligen Daten zu vergleichen:

%Vor%     
Joe Kington 24.09.2015, 14:12
quelle

Tags und Links