我正在尝试使用Gibbs采样实现LDA,在更新每个主题比例的步骤中,我有一个4层循环,它运行非常慢,我不确定如何提高代码的效率。我现在的代码如下:
N\u W是字数,N\u D是文档数,Z[i,j]是主题分配(1到K个可能的分配),X[i,j]是第i个文档中第j个单词的计数,Beta[K,:]是维度[K,N\u W]
更新如下:
for k in range(K): # iteratively for each topic update
n_k = np.zeros(N_W) # vocab size
for w in range(N_W):
for i in range(N_D):
for j in range(N_W):
# counting number of times a word is assigned to a topic
n_k[w] += (X[i,j] == w) and (Z[i,j] == k)
# update
Beta[k,:] = np.random.dirichlet(gamma + n_k)
我用以下矩阵做了一些测试:
原始代码:
然后只对内部两个循环进行矢量化:
最后,通过一些创造性的广播应用和提取共同元素:
这里的取舍是在速度和记忆之间。对于我使用的形状,这不是内存密集型的,但是我在上一个解决方案中构建的中间三维数组可能会非常大
您可以使用逻辑函数除去最后两个for循环:
甚至作为一个班轮:
n_k中的每一行都可以用于beta计算。现在它还包括nuw和nud作为限制,如果它们不等于X和Z的大小
相关问题 更多 >
编程相关推荐