最近,我使用 numpy 在 Python 上实现了 LDA 主题模型的 Gibbs 采样,参考了网站上的一些代码。在 Gibbs 采样的每次迭代中,我们删除一个(当前)单词,根据从 LDA 模型推断的后验条件概率分布为该单词采样一个新主题,并更新单词主题计数,如下所示:
for m, doc in enumerate(docs): #m: doc id
for n, t in enumerate(doc): #n: id of word inside document, t: id of the word globally
# discount counts for word t with associated topic z
z = z_m_n[m][n]
n_m_z[m][z] -= 1
n_z_t[z, t] -= 1
n_z[z] -= 1
n_m[m] -= 1
# sample new topic for multinomial
p_z_left = (n_z_t[:, t] + beta) / (n_z + V * beta)
p_z_right = (n_m_z[m] + alpha) / ( n_m[m] + alpha * K)
p_z = p_z_left * p_z_right
p_z /= numpy.sum(p_z)
new_z = numpy.random.multinomial(1, p_z).argmax()
# set z as the new topic and increment counts
z_m_n[m][n] = new_z
n_m_z[m][new_z] += 1
n_z_t[new_z, t] += 1
n_z[new_z] += 1
n_m[m] += 1
在上面的代码中,我们使用多项式 scipy 函数对一个新的(单个)z 进行采样。
现在,我想实现本文的联合情感主题模型。现在,我需要以下结构来跟踪所需的计数:
3D matrix containing # occurrences for a word for each topic, for each sentiment
3D matrix containing # occurrences for a topic, for each sentiment, for each document
2D matrix containing # occurrences for a topic, for each sentiment
2D matrix containing # occurrences for a sentiment for each document
现在问题来了:在这个 Gibbs 采样器中,对于文档中看到的每个单词,现在都从条件后验中采样了一个新主题和一个情感标签(论文的第 4 页等式 5)。我现在如何在 Python 中“对这两个值进行采样”?
提前致谢...