Numpy 双重求和

1 投票
1 回答
1324 浏览
提问于 2025-04-18 06:11

这里是图片描述

这里是图片描述

我的实现代码是:

def getGaussianValue(x, mean, covariance):
    part1 = 1/np.power(2*np.pi, x.shape[0]/2)
    part2 = 1/np.sqrt(np.linalg.det(covariance))
    part3 = np.exp(-(0.5) * np.matrix(x-mean) * np.matrix(np.linalg.inv(covariance)) *  np.matrix(x-mean).T)
    return part1 * part2 * part3 
def getLogLikelihood(K, data, pii, mean, covariance):
    sum_i = 0.0
    for i in range(data.shape[0]):
        sum_k = 0.0
        for k in range(K):
            sum_k += pii[k] * getGaussianValue(data[i], mean, covariance)
        sum_i += np.log(sum_k)
    return sum_i

这里的 N=150, K=3X 是一个 150x4 的numpy数组,Covariance(Sigma) 是一个 3x4x4 的numpy数组,而 mean(mu) 是一个 3x4 的numpy数组。请问怎么能让它运行得更快呢?

1 个回答

3

提前计算所有可能的东西总是个好主意,这样就不用重复计算了。

  1. 只需要把协方差矩阵反转一次,然后把反转后的矩阵存起来。
  2. 也只需计算一次归一化的部分 part1part2,而不是每次调用 getGaussianValue 时都计算。
  3. 没有必要两次计算 np.matrix(x-mean)(我不知道numpy是否会自动优化这个)。
  4. 可以考虑使用numpy自带的功能,比如 scipy.stats.multivariate_normal.pdf

撰写回答