Mittlerer quadratischer Fehler in Numpy?

79

Gibt es in numpy eine Methode zur Berechnung des mittleren quadratischen Fehlers zwischen zwei Matrizen?

Ich habe versucht zu suchen, aber keine gefunden. Ist es unter einem anderen Namen?

Wenn nicht, wie überwinden Sie das? Schreiben Sie es selbst oder verwenden Sie eine andere Bibliothek?

TheMeaningfulEngineer
quelle
13
((A - B) ** 2).mean(axis=ax), wo ax=0pro Spalte ist, ax=1ist pro Zeile und ax=Nonegibt eine Gesamtsumme.
Fred Foo
2
Wenn Sie das als Antwort formulieren, werde ich es akzeptieren.
TheMeaningfulEngineer
Diese Antwort ist nicht korrekt, da beim Quadrieren einer Numpy-Matrix eine Matrixmultiplikation durchgeführt wird, bei der jedes Element einzeln quadriert wird. Überprüfen Sie meinen Kommentar in der Antwort von Saullo Castro. (PS: Ich habe es mit Python 2.7.5 und Numpy 1.7.1 getestet)
Renatov
Auch nur als Hinweis für alle, die dies im Zusammenhang mit neuronalen Netzen betrachten, sollten Sie den Fehler summieren, nicht den Durchschnitt. Wenn Sie den Fehler mitteln, erhalten Sie falsche Gradientenwerte, wenn Sie versuchen, eine Gradprüfung durchzuführen (es sei denn, Sie berücksichtigen den Durchschnitt im Backprop, was mehr Arbeit ist als es wert ist)
Rezessiv

Antworten:

100

Sie können verwenden:

mse = ((A - B)**2).mean(axis=ax)

Oder

mse = (np.square(A - B)).mean(axis=ax)
  • Mit ax=0dem Durchschnitt wird entlang der Zeile für jede Spalte ein Array zurückgegeben
  • mit ax=1dem Durchschnitt wird entlang der Spalte für jede Zeile ein Array zurückgegeben
  • mit ax=Nonedem Durchschnitt wird elementweise entlang des Arrays ausgeführt, wobei ein Skalarwert zurückgegeben wird
Saullo GP Castro
quelle
2
Richtig, wenn ich falsch liege, aber ich denke, wenn Sie dies tun (MatrixA - MatrixB) ** 2, wird versucht, eine Matrixmultiplikation durchzuführen, die sich davon unterscheidet, jedes Element einzeln zu quadrieren. Wenn Sie versuchen, die folgende Formel mit einer nicht quadratischen Matrix zu verwenden, wird ein ValueError ausgelöst.
Renatov
7
@renatov vielleicht haben Sie mich missverstanden, mit einem np.ndarrayWillen eine elementweise Multiplikation für a**2, aber mit einem np.matrixlib.defmatrix.matrixWillen eine Matrixmultiplikation für a**2...
Saullo GP Castro
2
Entschuldigung, ich habe dich missverstanden. Ich dachte du benutzt numpy.matrix.
Renatov
1
Denken Sie daran, dass dies beim Vergleich von 2 Uint-Matrizen nicht funktioniert, da die Differenz negative Zahlen aufweist. Sie müssen int-Kopien vor der Hand machen ( Acmp = np.array(A, dtype=int))
Charles L.
3
np.nanmean(((A - B) ** 2))wenn Werte fehlen
user0
37

Dies ist nicht Teil von numpy, aber es wird mit numpy.ndarrayObjekten funktionieren . A numpy.matrixkann in a konvertiert werden numpy.ndarrayund a numpy.ndarraykann in a konvertiert werden numpy.matrix.

from sklearn.metrics import mean_squared_error
mse = mean_squared_error(A, B)

Siehe Scikit Lernen mean_squared_error für die Dokumentation, wie man Steuerachse.

Wohltätigkeit Leschinski
quelle
22

Noch numpy

np.square(np.subtract(A, B)).mean()
Mark Swardstrom
quelle
1
Übrigens entspricht dieser Weg der Sci-KitLearn-Funktion, schön!
E. AMARAL
5

Eine weitere Alternative zur akzeptierten Antwort, die Probleme mit der Matrixmultiplikation vermeidet:

 def MSE(Y, YH):
     return np.square(Y - YH).mean()

Aus den Dokumenten für np.square : " Geben Sie das elementweise Quadrat der Eingabe zurück."

Nickandross
quelle
2

Nur zum Spaß

mse = (np.linalg.norm (AB) ** 2) / len (A)

dcneuro
quelle
0

Die Standard-Numpy-Methoden zur Berechnung des mittleren quadratischen Fehlers (Varianz) und seiner Quadratwurzel (Standardabweichung) sind numpy.var()und numpy.std(), siehe hier und hier . Sie gelten für Matrizen und haben dieselbe Syntax wie numpy.mean().

Ich nehme an, dass die Frage und die vorhergehenden Antworten möglicherweise veröffentlicht wurden, bevor diese Funktionen verfügbar wurden.

Vadim
quelle
MSE und Varianz sind nicht gleich, es sei denn, der Mittelwert ist Null (dh es sei denn, A und B haben den gleichen Mittelwert, so dass AB in den obigen Berechnungen den Mittelwert Null hat).
Drew