Wie führe ich eine Faltung in Python mit Gaussian mit variabler Breite durch?

8

Ich muss eine Faltung mit einer Gauß-Funktion durchführen, aber die Breite der Gauß-Kurve muss sich ändern. Ich mache keine traditionelle Signalverarbeitung, aber stattdessen muss ich meine perfekte Probability Density Function (PDF) nehmen und sie "schmieren", basierend auf der Auflösung meiner Ausrüstung.

Nehmen Sie zum Beispiel an, dass meine PDF-Datei als Spike / Delta-Funktion beginnt. Ich werde das als ein sehr schmales Gauß-Modell modellieren. Nachdem ich meine Ausrüstung durchgelaufen bin, wird sie nach einer Gauß'schen Auflösung beschmiert. Ich kann dies mit den scipy.signal Faltungsfunktionen berechnen.

%Vor%

Das alles funktioniert kein Problem. Aber nehmen wir nun an, dass mein Original-PDF keine Spitze ist, sondern eine breitere Funktion. Zum Beispiel, ein Gaussian mit Sigma = 1,0. Und nun angenommen, meine Auflösung tatsächlich varys über x: bei x = 0,5 ist die Schmierfunktion eine Gaußsche mit sigma_conv = 0,5, aber bei x = 1,5 ist die Schmierfunktion eine Gaußsche mit sigma_conv = 1,5. Und angenommen, ich kenne die funktionale Form der x-Abhängigkeit meines schmierenden Gaußschen. Naiv dachte ich, ich würde die obige Zeile in

ändern %Vor%

Aber das funktioniert nicht, weil die Norm-Funktion einen Wert für die Breite erwartet, keine Funktion. In gewissem Sinne brauche ich meine Faltungsfunktion als 2D-Array, wobei ich für jeden Punkt in meinem Original-PDF, der ein 1D-Array bleibt, einen anderen Gaussian-Wert habe.

Gibt es also eine Möglichkeit, dies mit bereits in Python definierten Funktionen zu tun? Ich habe einen Code, um das zu tun, den ich selbst geschrieben habe ... aber ich möchte sicherstellen, dass ich nicht nur das Rad neu erfunden habe.

Vielen Dank im Voraus!

Matt

    
Matt Bellis 04.09.2013, 21:21
quelle

1 Antwort

5

Frage, kurz:
Wie kann man mit einem nicht-stationären Kernel falten, zum Beispiel mit einem Gaussian, der die Breite für verschiedene Stellen in den Daten ändert, und macht Python ein existierendes Werkzeug dafür?

Antwort, Art von:
Es ist schwierig, ein Negativ zu beweisen, aber ich denke nicht, dass eine Funktion, um eine Faltung mit einem nicht-stationären Kernel durchzuführen, in scipy oder numpy existiert. Wie auch immer, wie Sie es beschreiben, kann es nicht wirklich gut vektorisiert werden, also können Sie auch eine Schleife machen oder einen benutzerdefinierten C-Code schreiben.

Ein Trick, der für Sie funktionieren könnte, ist, statt die Kernelgröße mit der Position zu ändern, die Daten mit der inversen Skalierung zu dehnen (dh an Stellen, an denen Sie die Gaußschen mit möchten sei 0,5 die Basisbreite, strecke die Daten auf 2x). Auf diese Weise können Sie eine einzelne Warpoperation für die Daten durchführen, eine Standardfaltung mit einer festen Gauß-Breite, und dann die Daten auf die ursprüngliche Skalierung zurücksetzen.

Die Vorteile dieses Ansatzes liegen darin, dass er sehr einfach zu schreiben ist und vollständig vektorisiert ist und daher wahrscheinlich ziemlich schnell ausgeführt wird.

Das Verziehen der Daten (z. B. mit einer Interpolationsmethode) führt zu einem gewissen Genauigkeitsverlust, aber wenn Sie die Daten so auswählen, dass die Daten beim ersten Warpvorgang immer erweitert und nicht reduziert werden, sollten die Verluste minimal sein / p>     

tom10 12.06.2014 14:21
quelle