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?


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

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.



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."


2

Nur zum Spaß

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.