【发布时间】: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