Среднеквадратическая ошибка в Numpy?

Есть ли в numpy метод вычисления среднеквадратичной ошибки между двумя матрицами?

Я пробовал искать, но ничего не нашел. Он под другим именем?

Если нет, то как вы преодолеваете это? Вы сами пишете или используете другую библиотеку?


person TheMeaningfulEngineer    schedule 27.05.2013    source источник
comment
((A - B) ** 2).mean(axis=ax), где ax=0 — для столбца, ax=1 — для строки, а ax=None — общая сумма.   -  person Fred Foo    schedule 27.05.2013
comment
Если вы сформулируете это как ответ, я приму это.   -  person TheMeaningfulEngineer    schedule 28.05.2013
comment
Этот ответ неверен, потому что, когда вы возводите в квадрат пустую матрицу, она будет выполнять матричное умножение, ратарное возведение в квадрат каждого элемента индивидуально. Проверьте мой комментарий в ответе Саулло Кастро. (PS: я тестировал его с помощью Python 2.7.5 и Numpy 1.7.1)   -  person renatov    schedule 19.04.2014
comment
Также в качестве примечания для тех, кто смотрит на это в контексте нейронных сетей, вы должны суммировать ошибку, а не среднее значение. Усреднение ошибки даст вам неправильные значения градиента, если вы попытаетесь выполнить проверку градиента (если вы не учитываете среднее значение в обратном распространении, что требует больше работы, чем оно того стоит)   -  person Recessive    schedule 28.01.2020


Ответы (6)


Ты можешь использовать:

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

Or

mse = (np.square(A - B)).mean(axis=ax)
  • с ax=0 выполняется среднее по строке, для каждого столбца, возвращая массив
  • с ax=1 выполняется среднее по столбцу, для каждой строки, возвращая массив
  • с ax=None среднее значение выполняется по элементам массива, возвращая скалярное значение
person Community    schedule 04.08.2013
comment
Исправьте, если я ошибаюсь, но я думаю, что если вы сделаете (MatrixA - MatrixB) ** 2, он попытается выполнить матричное умножение, которое отличается от возведения в квадрат каждого элемента по отдельности. Если вы попытаетесь использовать следующую формулу с неквадратной матрицей, она вызовет ошибку ValueError. - person renatov; 05.04.2014
comment
@renatov в массиве Numpy эта формула будет применяться поэлементно, поэтому умножение матриц не выполняется - person Saullo G. P. Castro; 05.04.2014
comment
@Saulo Castro, я только что проверил, и я должен настаивать на том, что результат не будет поэлементным. Я использую Python 2.7.5 и Numpy 1.7.1. Я создал матрицу a и возвел ее в квадрат, используя следующие команды: a = numpy.matrix([[5, 5], [5, 5]]), а затем a ** 2. Результатом является пустая матрица matrix([[50, 50], [50, 50]]), которая показывает, что умножение пустой матрицы не будет поэлементным. - person renatov; 19.04.2014
comment
@renato, возможно, вы меня неправильно поняли, использование np.ndarray будет выполнять поэлементное умножение для a**2, но использование np.matrixlib.defmatrix.matrix будет выполнять матричное умножение для a**2... - person Saullo G. P. Castro; 21.04.2014
comment
Извините, я неправильно вас понял. Я думал, вы используете numpy.matrix. - person renatov; 21.04.2014
comment
Имейте в виду, что если вы сравниваете две матрицы uint, это не сработает, потому что разница будет иметь отрицательные числа. Вам нужно будет сделать целые копии заранее (Acmp = np.array(A, dtype=int)) - person Charles L.; 02.11.2015
comment
np.nanmean(((A - B) ** 2)) если отсутствуют значения - person user0; 04.12.2016
comment
Первое решение тоже похоже на синтаксис массива numpy, но это не так (см. комментарий Саулло Кастро), поэтому это очень конкретное исходное предположение (с использованием np.matrix) должно быть частью ответа, иначе оно действительно вводит в заблуждение. - person fotis j; 15.05.2019
comment
Возможно ли иметь MSE между двумя 2D-массивами, равный 263,562. - person asendjasni; 27.10.2019

Это не часть numpy, но будет работать с numpy.ndarray объектами. numpy.matrix можно преобразовать в numpy.ndarray, а numpy.ndarray можно преобразовать в numpy.matrix.

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

См. Scikit Learn mean_squared_error, чтобы узнать, как управлять осью .

person Charity Leschinski    schedule 03.04.2016

Еще более тупой

np.square(np.subtract(A, B)).mean()
person Mark Swardstrom    schedule 19.11.2017
comment
Кстати, этот способ эквивалентен функции Sci-kitLearn, здорово! - person E. AMARAL; 25.05.2019

Другая альтернатива принятому ответу, позволяющая избежать проблем с матричным умножением:

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

Из документов для np.square:

Return the element-wise square of the input.
person Community    schedule 31.08.2017

Просто для удовольствия

mse = (np.linalg.norm(A-B)**2)/len(A)
person dcneuro    schedule 16.06.2020

Стандартные методы numpy для вычисления среднеквадратичной ошибки (дисперсии) и ее квадратного корня (стандартного отклонения) — numpy.var() и numpy.std(), см. здесь и здесь. Они применяются к матрицам и имеют тот же синтаксис, что и numpy.mean().

Я предполагаю, что вопрос и предыдущие ответы могли быть опубликованы до того, как эти функции стали доступны.

person Roger Vadim    schedule 12.10.2020
comment
MSE и дисперсия не совпадают, если среднее значение равно нулю (т. е. если A и B имеют одинаковое среднее значение, так что AB имеет среднее значение, равное нулю в приведенных выше расчетах). - person Drew; 03.11.2020