繁体   English   中英

执行矩阵乘法时出现内存错误

[英]memory error while performing matrix multiplication

作为我正在进行的项目的一部分,我需要计算2m向量之间的均方误差。

基本上我有两个矩阵xxhat ,它们的大小都是m × n ,而我感兴趣的向量是这些向量的行。

我用此代码计算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))

它工作正常,此公式正确。

问题是在我的特定情况下,我的mn非常大。 具体来说, m = 60000n = 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的更多想法,请参见user1984065在评论中提供链接

如果您也要提高性能,则可以使用np.einsum来计算平方差之和的一种替代方法,如下所示:

subs = x-xhat
out = np.einsum('ij,ij',subs,subs)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM