【发布时间】:2021-06-30 13:17:15
【问题描述】:
我写了这个函数,用于计算给定多元高斯参数的 x 的概率。其中 x 是具有 2 个特征的特征,mu 是 2 个特征的向量,sigma 是 2x2。
def prob(x, mu, sigma):
n = len(x)
var = x - mu
sigma_inv = np.linalg.inv(sigma)
rhs = np.exp(-0.5*np.matmul(np.matmul(var.T, sigma_inv),var))
lhs = 1/(((2*np.pi)**(n/2))*np.linalg.det(sigma)**.5)
return rhs*lhs
但这仅在 x 是一维数组时才有效。我希望能够针对目前我拥有的多维 x(例如 x 为 100x2)进行矢量化和优化。
for i in range(len(x)):
curr_prob = prob(x[i], mu, sigma)
if i == 0:
prob = curr_prob
else:
prob = np.append(prob, curr_prob)
但这很慢。我听说有一种方法可以为此使用 np.vectorize 或 np.pyfunc,但我不确定如何应用它们。
【问题讨论】:
-
首先,在循环中使用
np.append很慢。np.array([prob(i, mu, sigma) for i in x])应该更快。但是加速矢量化需要重写prob以直接使用二维x。请注意,inv, matmul和det可以处理 3d 数组,有效地“批量”矩阵。 -
@hpaulj 你介意发布如何在 3D 数组上应用 inv、matmul 和 det 吗?
-
@hpaulj 抱歉,我的意思是二维数组。基本上,如果您可以发布如何进行批处理操作,我将非常感激。
标签: python arrays numpy gaussian