Frage Python MemoryError in der Scipy Radial Basis Funktion (scipy.interpolate.rbf)


Ich versuche eine nicht so große (~ 10.000 Samples) Punktwolke zu interpolieren, die eine 2D Oberfläche darstellt, mit Scipy Radial Basis Function (Rbf). Ich habe ein paar gute Ergebnisse, aber mit meinen letzten Daten bekomme ich immer MemoryError, obwohl der Fehler fast sofort während der Ausführung auftritt (der RAM wird offensichtlich nicht aufgefressen).

Ich habe mich entschieden, eine Kopie des rbf.py Datei von Scipy, beginnend mit Auffüllen mit einigen Druckanweisungen, die sehr nützlich gewesen sind. Durch die Zerlegung der _euclidean_norm Methode Zeile für Zeile, wie folgt:

def _euclidean_norm(self, x1, x2):
    d = x1 - x2
    s = d**2
    su = s.sum(axis=0)
    sq = sqrt(su)
    return sq

Ich bekomme den Fehler in der ersten Zeile:

File "C:\MyRBF.py", line 68, in _euclidean_norm
    d = x1 - x2
MemoryError

Diese Norm wird von einem Array X1 in der Form [[x1, y1], [x2, y2], [x3, y3], ..., [xn, yn]] und X2 aufgerufen, welches X1 transponiert ist durch folgende Methode nach innen Rbf Klasse, die ich bereits mit Debugging-Zwecken gehackt habe:

def _call_norm(self, x1, x2):
    print x1.shape
    print x2.shape
    print

    if len(x1.shape) == 1:
        x1 = x1[newaxis, :]
    if len(x2.shape) == 1:
        x2 = x2[newaxis, :]
    x1 = x1[..., :, newaxis]
    x2 = x2[..., newaxis, :]

    print x1.shape
    print x2.shape
    print

    return self._euclidean_norm(x1, x2)

Bitte beachten Sie, dass ich die Formen der Eingaben drucke. Mit meinem aktuellen Datensatz bekomme ich das (ich habe die Kommentare manuell hinzugefügt):

(2, 10744)         ## Input array of 10744 x,y pairs
(2, 10744)         ## The same array, which is to be "reshaped/transposed"

(2, 10744, 1)      ## The first "reshaped/transposed" form of the array
(2, 1, 10744)      ## The second "reshaped/transposed" form of the array

Die Begründung lautet, gemäß der Dokumentation "eine Matrix der Abstände von jedem Punkt in x1 zu jedem Punkt in x2" zu erhalten, was bedeutet, dass, da die Arrays die gleichen sind, eine Matrix von Abständen zwischen jedem Paar des Entry-Arrays ( welches die X- und Y-Dimensionen enthält).

Ich habe die Operation manuell mit viel kleineren Arrays (Shapes (2,5,1) und (2,1,5), zum Beispiel) getestet und die Subtraktion funktioniert.

Wie kann ich herausfinden, warum es nicht mit meinem Dataset funktioniert? Gibt es einen anderen offensichtlichen Fehler? Sollte ich irgendeine Form der schlechten Konditionierung meines Datensatzes prüfen oder eine Vorverarbeitung durchführen? Ich denke, es ist gut konditioniert, da ich es in 3D darstellen kann und der Cloudpoint visuell sehr gut geformt ist.

Jede Hilfe würde sehr geschätzt werden.

Danke fürs Lesen.


5
2017-08-08 13:15


Ursprung


Antworten:


Ihr Datensatz sollte in Ordnung sein: Der Fehler tritt auf, weil Sie nicht genügend RAM haben, um das Ergebnis der Subtraktion zu speichern.

Nach den Rundfunkregeln wird das Ergebnis Gestalt annehmen

 (2, 10744,     1)
-(2,     1, 10744)
------------------
 (2, 10744, 10744)

Angenommen, dies sind Arrays von dtype float64, benötigen Sie 2 * 10744 ** 2 * 8 = 1,72 GiB freien Speicher. Wenn nicht genügend freier Speicher vorhanden ist, kann numpy das Ausgabe-Array nicht zuordnen und wird sofort mit dem angezeigten Fehler fehlschlagen.


7
2017-08-08 19:00