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.ndarray
,numpy.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中的均方误差?的主要内容,如果未能解决你的问题,请参考以下文章