Середня квадратична помилка в Numpy?


81

Чи існує метод numpy для обчислення середньоквадратичної помилки між двома матрицями?

Я намагався шукати, але не знайшов жодного. Це під іншою назвою?

Якщо немає, то як це подолати? Ви пишете це самостійно або використовуєте іншу бібліотеку?


13
((A - B) ** 2).mean(axis=ax), де ax=0на стовпець, ax=1це на рядок і ax=Noneдає загальний підсумок.
Fred Foo

2
Якщо ви сформулюєте це як відповідь, я прийму це.
TheMeaningfulEngineer

Ця відповідь не є правильною, оскільки коли ви формуєте матрицю numpy, вона виконує множення матриці rathar квадрат кожного елемента окремо. Перевірте мій коментар у відповіді Сауло Кастро. (PS: Я тестував його за допомогою Python 2.7.5 та Numpy 1.7.1)
renatov

Також як примітку для тих, хто дивиться на це в контексті нейронних мереж, ви повинні підсумувати помилку, а не середню. Усереднення помилки дасть вам неправильні значення градієнта, якщо ви спробуєте виконати перевірку градації (якщо ви не врахуєте в backprop середнє значення, яке більше роботи, ніж це варте)
Рецесивний

Відповіді:


100

Ви можете використовувати:

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

Або

mse = (np.square(A - B)).mean(axis=ax)
  • із ax=0середнім значенням виконується вздовж рядка, для кожного стовпця, повертаючи масив
  • із ax=1середнім значенням виконується вздовж стовпця, для кожного рядка, повертаючи масив
  • із ax=Noneсереднім значенням виконується елементно вздовж масиву, повертаючи скалярне значення

2
Виправте, якщо я помиляюся, але я думаю, що якщо ви це зробите (MatrixA - MatrixB) ** 2, він спробує виконати множення матриці, яке відрізняється від квадрата кожного елемента окремо. Якщо ви спробуєте використати наступну формулу з неквадратною матрицею, це призведе до ValueError.
Ренатов

7
@renatov, можливо, ви мене неправильно зрозуміли, використовуючи np.ndarrayволю, виконайте елементне множення для a**2, але використання np.matrixlib.defmatrix.matrixволі зробіть матричне множення для a**2...
Саулло Г.П. Кастро

2
Вибачте, я вас неправильно зрозумів. Я думав, ви використовуєте numpy.matrix.
Ренатов

1
Майте на увазі, що якщо ви порівнюєте 2 матриці uint, це не спрацює, оскільки різниця матиме від’ємні числа. Вам потрібно буде зробити внутрішні копії заздалегідь ( Acmp = np.array(A, dtype=int))
Чарльз Л.

3
np.nanmean(((A - B) ** 2))якщо відсутні значення
user0

38

Це не є частиною numpy, але це буде працювати з numpy.ndarrayоб’єктами. A numpy.matrixможна перетворити на a, numpy.ndarrayа a numpy.ndarray- на a numpy.matrix.

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

Див. Scikit Learn mean_squared_error для отримання документації щодо управління віссю.



5

Інша альтернатива прийнятій відповіді, яка дозволяє уникнути будь-яких проблем із множенням матриць:

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

З документів для np.square : "Поверніть елементний квадрат введення."


4

Тільки для ударів ногами

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


0

Стандартні методи Numpy для розрахунку середньої квадратичної помилки (дисперсії) і його квадратний корінь (стандартне відхилення) є numpy.var()і numpy.std()дивіться тут і тут . Вони застосовуються до матриць і мають такий самий синтаксис, як numpy.mean().

Я припускаю, що питання та попередні відповіді могли бути опубліковані до того, як ці функції стали доступними.


MSE та дисперсія не є однаковими, якщо середнє значення не дорівнює нулю (тобто, якщо A і B не мають однакового середнього значення, так що AB має середнє нуль у розрахунках вище).
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.