¿Error cuadrático medio en Numpy?


81

¿Existe un método en numpy para calcular el error cuadrático medio entre dos matrices?

Intenté buscar pero no encontré ninguno. ¿Tiene un nombre diferente?

Si no lo hay, ¿cómo se supera? ¿Lo escribe usted mismo o usa una biblioteca diferente?


13
((A - B) ** 2).mean(axis=ax), donde ax=0es por columna, ax=1es por fila y ax=Noneda un total general.
Fred Foo

2
Si formula eso como respuesta, lo aceptaré.
TheMeaningfulEngineer

Esta respuesta no es correcta porque cuando eleva al cuadrado una matriz numérica, realizará una multiplicación de matrices rathar al cuadrado de cada elemento individualmente. Revisa mi comentario en la respuesta de Saullo Castro. (PD: lo probé usando Python 2.7.5 y Numpy 1.7.1)
renatov

También como una nota para cualquiera que vea esto en el contexto de las redes neuronales, debe sumar el error, no el promedio. Promediar el error le dará valores de gradiente incorrectos si intenta hacer una verificación de graduación (a menos que contabilice en backprop el promedio, que es más trabajo de lo que vale)
Recesivo

Respuestas:


100

Puedes usar:

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

O

mse = (np.square(A - B)).mean(axis=ax)
  • con ax=0el promedio se realiza a lo largo de la fila, para cada columna, devolviendo una matriz
  • con ax=1el promedio se realiza a lo largo de la columna, para cada fila, devolviendo una matriz
  • con ax=Noneel promedio se realiza por elementos a lo largo de la matriz, devolviendo un valor escalar

2
Correcto si me equivoco, pero creo que si lo hace (MatrixA - MatrixB) ** 2, intentará realizar una multiplicación de matrices, que es diferente a elevar al cuadrado cada elemento individualmente. Si intenta utilizar la siguiente fórmula con una matriz no cuadrada, generará un ValueError.
renatov

7
@renatov tal vez me malinterpretó, usar a np.ndarrayhará una multiplicación de elementos para a**2, pero np.matrixlib.defmatrix.matrixusará hará una multiplicación de matrices para a**2...
Saullo GP Castro

2
Lo siento, te entendí mal. Pensé que estabas usando numpy.matrix.
renatov

1
Tenga en cuenta que si está comparando matrices de 2 unidades, esto no funcionará porque la diferencia tendrá números negativos. Deberá hacer copias int de antemano ( Acmp = np.array(A, dtype=int))
Charles L.

3
np.nanmean(((A - B) ** 2))si faltan valores
usuario0

38

Esto no es parte de numpy, pero funcionará con numpy.ndarrayobjetos. A numpy.matrixse puede convertir en un numpy.ndarrayy una numpy.ndarrayse puede convertir en una numpy.matrix.

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

Consulte Scikit Learn mean_squared_error para obtener documentación sobre cómo controlar el eje.


23

Aún más numpy

np.square(np.subtract(A, B)).mean()

1
Por cierto, de esta manera es equivalente a la función Sci-kitLearn, ¡genial!
E. AMARAL

5

Otra alternativa a la respuesta aceptada que evita cualquier problema con la multiplicación de matrices:

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

De los documentos para np.square : "Devuelve el cuadrado de elementos de la entrada".


4

Sólo por diversión

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


0

Los métodos numéricos estándar para calcular el error cuadrático medio (varianza) y su raíz cuadrada (desviación estándar) son numpy.var()y numpy.std(), consulte aquí y aquí . Se aplican a matrices y tienen la misma sintaxis que numpy.mean().

Supongo que la pregunta y las respuestas anteriores podrían haberse publicado antes de que estas funciones estuvieran disponibles.


El MSE y la varianza no son lo mismo a menos que la media sea cero (es decir, a menos que A y B tengan la misma media para que AB tenga una media cero en los cálculos anteriores).
Dibujó el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.