Numpy 双重求和
我的实现代码是:
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=3
,X
是一个 150x4
的numpy数组,Covariance(Sigma)
是一个 3x4x4
的numpy数组,而 mean(mu)
是一个 3x4
的numpy数组。请问怎么能让它运行得更快呢?
1 个回答
3
提前计算所有可能的东西总是个好主意,这样就不用重复计算了。
- 只需要把协方差矩阵反转一次,然后把反转后的矩阵存起来。
- 也只需计算一次归一化的部分
part1
和part2
,而不是每次调用getGaussianValue
时都计算。 - 没有必要两次计算
np.matrix(x-mean)
(我不知道numpy是否会自动优化这个)。 - 可以考虑使用numpy自带的功能,比如
scipy.stats.multivariate_normal.pdf
。