作为我正在进行的项目的一部分,我需要计算 2m 向量之间的均方误差。
基本上我有两个矩阵 x 和 xhat,都是 m 乘以 n 和向量 I'我感兴趣的是这些向量的行。
我用这段代码计算了MSE
def cost(x, xhat): #mean squared error between x the data and xhat the output of the machine
return (1.0/(2 * m)) * np.trace(np.dot(x-xhat,(x-xhat).T))
它工作正常,这个公式是正确的。
问题是在我的具体情况下,我的 m 和 n 非常大。具体来说,m = 60000 和 n = 785。所以当我运行我的代码并进入这个函数时,我得到一个内存错误。
有没有更好的方法来计算 MSE?我宁愿避免 for 循环,而且我非常倾向于矩阵乘法,但矩阵乘法在这里似乎非常浪费。也许我不知道 numpy 中的某些内容?
请您参考如下方法:
表达式 np.dot(x-xhat,(x-xhat).T) 创建一个形状为 (m, m) 的数组。你说 m 是 60000,所以这个数组几乎是 29 GB。
您获取数组的迹线,它只是对角线元素的总和,因此这个巨大数组的大部分未被使用。如果你仔细看 np.trace(np.dot(x-xhat,(x-xhat).T)),你会发现它只是所有的平方和x - xhat 的元素。因此,一种不需要巨大的中间数组来计算 np.trace(np.dot(x-xhat,(x-xhat).T)) 的更简单方法是 ((x - xhat)**2).sum().例如,
In [44]: x
Out[44]:
array([[ 0.87167186, 0.96838389, 0.72545457],
[ 0.05803253, 0.57355625, 0.12732163],
[ 0.00874702, 0.01555692, 0.76742386],
[ 0.4130838 , 0.89307633, 0.49532327],
[ 0.15929044, 0.27025289, 0.75999848]])
In [45]: xhat
Out[45]:
array([[ 0.20825392, 0.63991699, 0.28896932],
[ 0.67658621, 0.64919721, 0.31624655],
[ 0.39460861, 0.33057769, 0.24542263],
[ 0.10694332, 0.28030777, 0.53177585],
[ 0.21066692, 0.53096774, 0.65551612]])
In [46]: np.trace(np.dot(x-xhat,(x-xhat).T))
Out[46]: 2.2352330441581061
In [47]: ((x - xhat)**2).sum()
Out[47]: 2.2352330441581061
有关计算 MSE 的更多想法,请参阅 link provided by user1984065在评论中。
