Niedawno zaimplementowałem próbkowanie Gibbs dla modelu tematycznego LDA na Pythonie za pomocą numpy, przyjmując jako odniesienie kod z witryny. W każdej iteracji próbkowania Gibbs usuwamy jedno (bieżące) słowo, próbujemy nowy temat dla tego słowa zgodnie z późniejszym warunkowym rozkładem prawdopodobieństwa wywnioskowanym z modelu LDA i aktualizujemy liczenie słów-słów, w następujący sposób:Wdrażanie modelu tematycznego za pomocą Pythona (numpy)
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
W powyższym kodzie próbkujemy nowego (pojedynczego) z za pomocą wielomianowej funkcji scipy.
Teraz chcę wdrożyć model tematów wspólnych sentencji z this paper. Teraz będę potrzebował następujących struktur śledzenie potrzebnych powodów:
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
A teraz jest problem: w tym Gibbs sampler, dla każdego słowa widoczne w dokumencie zarówno nowy wątek i etykieta nastroje są teraz próbkowane z warunkowego posteriori (strona 4 równanie 5 artykułu). Jak mogę teraz "wypróbować te 2 wartości" w Pythonie?
Z góry dziękuję ...
Co robi pierwsza pętla 'for'? wydaje się, że wszystko, co się robi w pierwszym "za", zostaje cofnięte na drugim. – Netzsooc