我想在numpy中实现以下问题,下面是我的代码。在
对于这个问题,我已经用一个for循环尝试了以下numpy代码。我想知道有没有更有效的方法来做这个计算?我真的很感激!在
k, d = X.shape
m = Y.shape[0]
c1 = 2.0*sigma**2
c2 = 0.5*np.log(np.pi*c1)
c3 = np.log(1.0/k)
L_B = np.zeros((m,))
for i in xrange(m):
if i % 100 == 0:
print i
L_B[i] = np.log(np.sum(np.exp(np.sum(-np.divide(
np.power(X-Y[i,:],2), c1)-c2,1)+c3)))
print np.mean(L_B)
我想通过创建一个3D张量来实现np.expand_dims(X, 2).repeat(Y.shape[0], 2)-Y
,因此下面的计算可以通过广播来完成,但是当{
我还认为np.einsum()
只利用for循环,所以可能没有那么有效,如果我错了,请纠正我。在
有什么想法吗?在
优化阶段1
我的第一个优化级别是在引入一个新轴的基础上,将循环代码直接转换为基于
broadcasting
的轴,因此内存效率不高,如下所示-优化阶段2
考虑到我们打算将常量的操作分离出来,我们引入了一些优化,最后得出了以下结论-
^{pr2}$优化阶段3
我进一步研究了它,看到了操作可以优化的地方,最后我使用^{} 来代替平方和
sum-reduction
的繁重工作。这应该是非常节省内存的,并为我们提供了最终的实现,如下所示-运行时测试
方法-
时间安排和验证-
在那里加速!在
相关问题 更多 >
编程相关推荐