¿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?

El Ingeniero Significativo
fuente
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
Saullo GP Castro
fuente
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.

Charity Leschinski
fuente
23

Aún más numpy

np.square(np.subtract(A, B)).mean()
Mark Swardstrom
fuente
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".

Nickandross
fuente
4

Sólo por diversión

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

dcneuro
fuente
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.

Vadim
fuente
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