【问题标题】:memory error while performing matrix multiplication执行矩阵乘法时出现内存错误
【发布时间】:2017-02-17 01:31:36
【问题描述】:

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

基本上我有两个矩阵xxhat,大小都是m by 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 中的某些东西?

【问题讨论】:

标签: python numpy math memory matrix


【解决方案1】:

如果您也想提高性能,计算平方差和的另一种方法可能是使用np.einsum,就像这样 -

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

【讨论】:

    【解决方案2】:

    表达式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

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2014-11-14
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多