2013-05-27 14 views
29

Esiste un metodo in numpy per calcolare l'errore quadratico medio tra due matrici?Errore quadratico medio in Numpy?

Ho provato a cercare ma non ne ho trovato. È sotto un nome diverso?

Se non c'è, come si supera questo? Lo scrivi tu stesso o usi una lib diversa?

+11

'((A - B) ** 2) .mean (asse = ax)', dove 'ax = 0 'è per colonna,' ax = 1' è per-row e 'ax = None' danno un totale generale. –

+2

Se lo formula come risposta, lo accetto. – TheMeaningfulEngineer

+0

Questa risposta non è corretta perché quando si quadrata una matrice numpy, eseguirà una moltiplicazione matriciale quadrata rathar ogni elemento individualmente. Controlla il mio commento nella risposta di Saullo Castro. (PS: L'ho provato usando Python 2.7.5 e Numpy 1.7.1) – renatov

risposta

39

Come suggerito da @larsmans è possibile utilizzare:

mse = ((A - B) ** 2).mean(axis=ax) 
  • con ax=0 viene eseguita la media lungo la fila, per ogni colonna, restituendo un array
  • con ax=1 la media viene eseguita lungo la colonna, per ogni riga, restituisce un array
  • con ax=None la media viene eseguita in senso elementare lungo l'array, restituendo un valore singolo
+2

Corretto se sbaglio, ma penso che se lo fai (MatrixA - MatrixB) ** 2 cercherà di eseguire una moltiplicazione di matrice, che è diverso dal quadrato ogni elemento singolarmente. Se si tenta di utilizzare la seguente formula con una matrice non quadrata, solleverà un'eccezione ValueError. – renatov

+0

@renatov in un array Numpy questa formula verrà applicata a livello di elemento in modo che nessuna moltiplicazione di matrice venga eseguita –

+0

@Saulo Castro, ho appena testato e devo insistere sul fatto che il risultato non sarà element-wise. Sto usando Python 2.7.5 e Numpy 1.7.1. Ho creato la matrice "a" e l'ho squadrata usign i seguenti comandi: 'a = numpy.matrix ([[5, 5], [5, 5]])' e poi 'a ** 2'. Il risultato è la matrice numpy 'matrix ([[50, 50], [50, 50]])', che mostra che la moltiplicazione della matrice numpy ** non ** sarà element-wise. – renatov

7

Questo non fa parte di numpy, ma funzionerà con gli oggetti numpy.ndarray. Un numpy.matrix può essere convertito in un numpy.ndarray e un numpy.ndarray può essere convertito in un numpy.matrix.

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

Vedere Scikit Learn mean_squared_error per la documentazione su come controllare l'asse.

1

Un'altra alternativa per la risposta accettata che evita eventuali problemi con la moltiplicazione di matrici:

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

Dai documenti per np.square: "Ritorno alla piazza elemento-saggio dell'ingresso"

1

Ancora più NumPy

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