Numpy中的均方误差?

112

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

我已经尝试过搜索,但没有找到。它可能有不同的名称吗?

如果没有,你会如何克服这个问题?你会自己编写还是使用不同的库?


14
((A - B) ** 2).mean(axis=ax),其中 ax=0 表示按列计算均值,ax=1 表示按行计算均值,ax=None 表示计算所有元素的均值。 - Fred Foo
2
如果你把它作为答案提出来,我会接受它。 - TheMeaningfulEngineer
1
这个答案是不正确的,因为当你对一个numpy矩阵进行平方时,它会执行矩阵乘法而不是分别对每个元素进行平方。请查看我在Saullo Castro的答案中的评论。(PS:我已经使用Python 2.7.5和Numpy 1.7.1进行了测试) - renatov
同样需要注意的是,如果您在神经网络的上下文中查看此内容,则应该对误差进行求和,而不是平均。如果您尝试进行梯度检查并对误差进行平均,那么将会得到不正确的梯度值(除非您在反向传播中考虑了平均值,但这比它所值得的要更加费力)。 - Recessive
7个回答

152

你可以使用:

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

或者

mse = (np.square(A - B)).mean(axis=ax)
  • 使用ax=0时,沿行执行平均值,并为每列返回一个数组
  • 使用ax=1时,沿列执行平均值,并为每行返回一个数组
  • 省略ax参数(或将其设置为ax=None)时,沿数组的每个元素执行平均值,并返回标量值

3
如果我说错了,请纠正我,但我认为如果你执行(MatrixA - MatrixB) ** 2这个操作,它将尝试执行矩阵乘法,这与对每个元素进行平方是不同的。如果你尝试对一个非方阵使用以下公式,它将引发一个ValueError错误。 - renatov
9
@renatov,也许你误解了我的意思。使用np.ndarray将对a**2进行逐元素乘法运算,但使用np.matrixlib.defmatrix.matrix将对a**2进行矩阵乘法运算... - Saullo G. P. Castro
2
抱歉,我误解了你的意思。我以为你在使用numpy.matrix。 - renatov
1
请记住,如果您正在比较两个无符号矩阵,则此方法将不起作用,因为差异将产生负数。在此之前,您需要进行整数复制(Acmp = np.array(A, dtype=int))。 - Charles L.
4
如果存在缺失值,返回np.nanmean(((A - B) ** 2))。 - user0
显示剩余4条评论

50

这不是 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以获取有关如何控制轴的文档。


35

更多的numpy

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

3
顺便一提,这种方式与Sci-kitLearn函数等效,不错! - E. AMARAL

9

只是为了好玩

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

6
另一种避免矩阵乘法问题的替代方案,与接受的答案不同:
 def MSE(Y, YH):
     return np.square(Y - YH).mean()

来自于 np.square文档

Return the element-wise square of the input.

2
标准的numpy方法用于计算均方误差(方差)和其平方根(标准差)是numpy.var()numpy.std(),请参阅herehere。它们适用于矩阵,并且与numpy.mean()具有相同的语法。
我猜测问题和前面的回答可能是在这些函数可用之前发布的。

关于统计的注解
回答@Drew的评论:
这个答案与本主题中的顶级答案是相等的。从技术上讲,均方误差(MSE)与方差不同,它使用参数的“真实”值而不是其估计值,参见 方差和均方误差之间的区别是什么?方差和均方误差之间的区别是什么?。然后,这两个量的差异由我们对中心参数的估计的偏差决定。然而,当计算样本方差时,如在OP中所做的那样,我们无法真正了解这个参数的值。我认为OP在宽泛的意义上使用了术语MSE

此外,上面提出的numpy函数允许使用参数ddof(自由度的数量),这可以获得无偏的方差估计(与一些关于Python和R的肤浅比较所声称的相反)。


除非均值为零(即,除非A和B具有相同的均值,以便在上述计算中A-B的均值为零),否则MSE和方差不相同。 - Drew

0

这样做符合 np.operation 的风格怎么样?

mse = np.mean(np.square(A - B))

请记住,如果没有指定axis关键字参数,np.mean()将输出一个标量,就像np.sum()一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接