Numpy中的均方误差?

Posted

技术标签:

【中文标题】Numpy中的均方误差?【英文标题】:Mean Squared Error in Numpy? 【发布时间】:2013-05-22 09:48:58 【问题描述】:

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

我尝试过搜索,但没有找到。是不是用了不同的名字?

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

【问题讨论】:

((A - B) ** 2).mean(axis=ax),其中ax=0 是每列,ax=1 是每行,ax=None 给出总计。 如果您将其表述为答案,我会接受。 这个答案是不正确的,因为当你对一个 numpy 矩阵求平方时,它会单独执行一个矩阵乘法,将每个元素平方。检查我在 Saullo Castro 的回答中的评论。 (PS:我已经使用 Python 2.7.5 和 Numpy 1.7.1 对其进行了测试) 另外,作为在神经网络背景下查看此内容的任何人的注释,您应该对误差求和,而不是平均值。如果您尝试进行梯度检查,平均误差会给您提供不正确的梯度值(除非您在反向传播中考虑平均值,这比它的价值更多) 【参考方案1】:

你可以使用:

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

或者

mse = (np.square(A - B)).mean(axis=ax)
ax=0 沿行执行平均,对于每一列,返回一个数组 ax=1 沿列执行平均,对于每一行,返回一个数组 ax=None 沿数组按元素执行平均,返回一个标量值

【讨论】:

如果我错了,请更正,但我认为如果你这样做 (MatrixA - MatrixB) ** 2 它将尝试执行矩阵乘法,这与每个元素单独平方不同。如果您尝试对非方阵使用以下公式,则会引发 ValueError。 @renatov 也许你误解了我,使用np.ndarray 将为a**2 进行元素乘法,但使用np.matrixlib.defmatrix.matrix 将为a**2 进行矩阵乘法... 对不起,我误会了你。我以为你在使用 numpy.matrix。 请记住,如果您要比较 2 个 uint 矩阵,这将不起作用,因为差异将具有负数。您需要事先制作 int 副本 (Acmp = np.array(A, dtype=int)) np.nanmean(((A - B) ** 2)) 如果缺少值【参考方案2】:

这不是numpy 的一部分,但它适用于numpy.ndarray 对象。 numpy.matrix 可以转换为numpy.ndarraynumpy.ndarray 可以转换为numpy.matrix

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

有关如何控制轴的文档,请参阅 Scikit Learn mean_squared_error。

【讨论】:

【参考方案3】:

更加麻木

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

【讨论】:

顺便说一句,这种方式相当于Sci-kitLearn的功能,不错!【参考方案4】:

避免矩阵乘法出现任何问题的公认答案的另一种选择:

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

从documents 到np.square

Return the element-wise square of the input.

【讨论】:

【参考方案5】:

只是为了好玩

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

【讨论】:

【参考方案6】:

计算均方误差(方差)及其平方根(标准差)的标准numpy方法是numpy.var()numpy.std(),见here和here。它们适用于矩阵并且具有与numpy.mean() 相同的语法。

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

【讨论】:

MSE 和方差不一样,除非均值为零(即,除非 A 和 B 具有相同的均值,因此 A-B 在上述计算中的均值为零)。

以上是关于Numpy中的均方误差?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 度量单位的准确性,平均绝对误差,回归问题的均方误差?

TensorFlow 计算的均方误差

计算不同值范围的均方误差

tensorflow的线性回归得到明显的均方误差

如何计算时间序列的均方误差?

Sklearn:如何获得对训练数据进行分类的均方误差