numpy中的均方误差?


79

numpy中是否有一种方法可以计算两个矩阵之间的均方误差?

我尝试搜索但没有找到。是否使用其他名称?

如果没有,您如何克服呢?您是自己编写还是使用其他库?


13
((A - B) ** 2).mean(axis=ax)ax=0每列,ax=1每行,ax=None总计。
弗雷德·福

2
如果您将其表述为答案,我将接受。
TheMeaningfulEngineer 2013年

这个答案是不正确的,因为当您对一个numpy矩阵求平方时,它将对每个元素分别进行矩阵乘法。在Saullo Castro的答案中查看我的评论。(PS:我已经使用Python 2.7.5和Numpy 1.7.1对其进行了测试)
renatov 2014年

同样,作为对在神经网络中研究此问题的任何人的注释,您应该对误差求和,而不是求平均值。如果尝试进行灰度检查,平均误差将为您提供不正确的渐变值(除非您为平均值计算了backprop的值,这比它值得的工作还要多)
隐性

Answers:


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。
renatov 2014年

7
@renatov也许您误解了我,使用anp.ndarray将对进行元素逐个乘法a**2,但是使用anp.matrixlib.defmatrix.matrix将对进行矩阵乘法a**2...
Saullo GP Castro 2014年

2
对不起,我误会了你。我以为您正在使用numpy.matrix。
renatov 2014年

1
请记住,如果您要比较2个uint矩阵,则这将不起作用,因为差异将为负数。您需要先进行int副本操作(Acmp = np.array(A, dtype=int)
Charles L.

3
np.nanmean(((A - B) ** 2))如果缺少值
user0

37

这不是的一部分numpy,但可以与numpy.ndarray对象一起使用。Anumpy.matrix可以转换为a numpy.ndarray,anumpy.ndarray可以转换为anumpy.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的文档中:“返回输入的按元素平方。”


2

只为踢

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


0

用于计算均方误差(方差)及其平方根(标准差)的标准numpy方法为numpy.var()numpy.std(),请参见此处此处。它们适用于矩阵,并且语法与相同numpy.mean()

我想在这些功能可用之前可能已经发布了问题和前面的答案。


除非平均值为零(即,除非A和B的平均值相同,以使AB在上述计算中的平均值为零),否则MSE和方差不相同。
德鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.