【问题标题】:Way to speed up numpy matrix multiplication for calculating gaussian probability densities加快计算高斯概率密度的numpy矩阵乘法的方法
【发布时间】:2020-10-05 20:02:38
【问题描述】:

我想在高维公式中使用高斯正态分布计算大量向量的概率密度,现在我有这个工作-

def f(self, x):
    #               [1x2]     [2x2]    [2x1] ==> [1x1]
    return np.exp(-(x.T @ self.inv_cov @ x) / 2) 

np.apply_along_axis(self.f, 1, x_m.T)

这里对应框中的公式

如果很好,但速度很慢。有没有比apply_along_axis 更好的方法来获得相同的结果?

我正在寻找一种可以改变[nx2]x[2x2]x[2xn] = [nx1]n 的方法。


我确实找到了一种解决方法,但它占用了大量的内存,numpy 只是说这是不可能的

解决方法是仅从该计算[nx2]x[2x2]x[2xn] 中获取结果[nxn] 矩阵的对角线元素

【问题讨论】:

  • apply_along_axis 不是速度工具。你的x_m 是什么形状?二维?简单的迭代同样好。但是@ 进行batch 计算,能够进行[m x 1x2] [m x 2x2] [m x 2x1] ==> [m x 1x1]np.einsum 也可以用于此。
  • 只有np.exp(-(x.T @ self.inv_cov @ x) / 2),没有apply_along_axis有什么问题?
  • @hpaulj 感谢您提供有关 批量计算 的信息,我搞定了。我的 x_m 是 [2xn],而 np.einsum 是我最近遇到的,必须研究一下!
  • @QuangHoang 在 x 是矩阵时计算指数将导致矩阵(括号内的项),而需要的是标量或向量。

标签: numpy probability matrix-multiplication


【解决方案1】:

感谢@hpaulj 之前的评论,我能够使用批处理计算如下-

我的 x_m 维度是 [2xN],通过这种修改,计算变成了维度,正如 @hpaulj 所评论的那样 --> [m x 1x2][m x 2x2][m x 2x1] ==> [m x 1x1]

np.exp(-np.reshape(x_m.T, (x_m.shape[1], 1, 2)) @ 
       np.repeat(np.expand_dims(self.inv_cov, axis=0), x_m.shape[1], axis=0) @ 
       np.reshape(x_m.T, (x_m.shape[1], 2, 1))/2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多