Numpy Double summation

时间:2014-05-11 13:35:42

标签: python arrays performance numpy scipy

enter image description here

enter image description here

我的实施是:

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=3X150x4 numpy数组,Covariance(Sigma)3x4x4 numpy数组,mean(mu)3x4 numpy数组。如何让它更快?

1 个答案:

答案 0 :(得分:3)

预先计算可能的所有内容并且永远不会计算任何东西两次总是一个好主意。

  1. 只需将协方差反转一次并存储反转矩阵
  2. 也只预先计算标准化术语part1part2,而不是每次调用getGaussianValue
  3. 无需计算np.matrix(x-mean)两次(不知道numpy是否优化了它)
  4. 考虑使用像scipy.stats.multivariate_normal.pdf
  5. 这样的numpy内置函数