Implementierte die wahrscheinlichste Schätzung des Themenmodells in Python. Als Lehrbuch [Themenmodell](https://www.amazon.co.jp/ Themenmodell - Professionelle Serie für maschinelles Lernen - Iwata-Guji / dp / 4061529048 / ref = sr_1_2? Ie = UTF8 & qid = 1501997285 & sr = 8-2 & keywords = Themenmodell) wurde verwendet.
Struktur dieses Artikels
Das Themenmodell geht davon aus, dass ein Dokument mehrere Themen enthält.
** Beispiel ** Artikel über "Medical Bill Deliberation" => Zwei Themen "Medical" und "Political" Artikel über "Wirtschaftliche Auswirkungen der Olympischen Spiele" => Zwei Themen, "Sport" und "Wirtschaft"
Um die Annahme besser auszudrücken, dass ein Dokument mehrere Themen hat Legen Sie die Themenverteilung $ \ boldsymbol \ theta_d = (\ theta_ {d1}, \ cdots, \ theta_ {dK}) $ für jedes Dokument fest. $ \ theta_ {dk} = p (k \ | \ \ boldsymbol \ theta_d) $ ist die Wahrscheinlichkeit, dass das Thema $ k $ einem Wort im Dokument $ d $ zugewiesen wird. Das Thema $ z_ {dn} $ wird jedem Wort im Dokument $ d $ gemäß der Themenverteilung $ \ boldsymbol \ theta_d $ zugewiesen. Wörter werden gemäß der Wortverteilung $ \ boldsymbol \ phi_ {z_ {dn}} $ des zugewiesenen Themas generiert. $ \ boldsymbol \ phi_k = (\ phi_ {k1}, \ cdots, \ phi_ {kV}) $ repräsentiert die Wahrscheinlichkeit, dass das Thema $ k $ das Vokabular $ v $ erzeugt.
Die folgende Abbildung zeigt den Prozess zum Generieren eines bestimmten Dokumentensatzes.
Jedem Wort wird ein Thema zugewiesen, und Wörter werden aus der Wortverteilung gemäß diesem Thema generiert. In der Mitte der Abbildung besteht eine hohe Wahrscheinlichkeit, dass die Themen "Sport" und "Wirtschaft" zugeordnet werden. Viele Wörter, die sich auf diese beiden Themen beziehen, werden beobachtet. Betrachtet man die Wortverteilung wirtschaftlicher Themen in absteigender Reihenfolge der Generationswahrscheinlichkeit Es steht im Einklang mit "Wirtschaft", "Aktienkurs", "Wirtschaft" und "starkem Yen".
Die Methode zur Schätzung des wahrscheinlichsten Themenmodells heißt ** probabilistische latente Bedeutungsanalyse ** (** PLSA ). Die Bayes'sche Schätzung des Themenmodells ist übrigens eine Methode namens ** latent Diricle Distribution Model ** ( LDA **).
PLSA verwendet den EM-Algorithmus, um das wahrscheinlichste Themenmodell zu schätzen. Parameter, die die Log-Wahrscheinlichkeit unter $ \ boldsymbol \ Theta = (\ boldsymbol \ theta_1, \ cdots, \ boldsymbol \ theta_D) $ und $ \ boldsymbol \ Phi = (\ boldsymbol \ phi_1, \ cdots, \ boldsymbol \ maximieren) phi_K) Finde $.
\begin{align}
L &= \sum^D_{d = 1} \sum^{N_d}_{n = 1} \log \sum^K_{k = 1} \theta_{dk}\phi_{kw_{dn}} \\
&= \sum^D_{d = 1} \sum^{N_d}_{n = 1} \log \sum^K_{k = 1} q_{dnk} \frac{\theta_{dk}\phi_{kw_{dn}}}{q_{dnk}} \\
&\geq \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log \frac{\theta_{dk}\phi_{kw_{dn}}}{q_{dnk}} \\
&= \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log \theta_{dk}\phi_{kw_{dn}} - \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log q_{dnk} \equiv F \tag{1}
\end{align}
Verwenden Sie den EM-Algorithmus, um die Untergrenze von $ F $ zu maximieren. Im Folgenden werden wir die Formel erweitern, indem wir sie in ** E-Schritt ** und ** M-Schritt ** unterteilen.
Hier werde ich die einmal verwendeten Zeichen sortieren.
$ D $: Anzahl der Dokumente
$ N_d $: Anzahl der im Dokument $ d $ enthaltenen Wörter (Dokumentlänge)
$ V $: Anzahl der Wortarten (Anzahl der Vokabeln), die in allen Dokumenten vorkommen
$ \ boldsymbol W $: Dokumentensatz
$ \ boldsymbol w_d $: Dokument $ d $
$ w_ {dn} $: $ n $ th Wort in Dokument $ d $
$ K $: Anzahl der Themen
$ \ theta_ {dk} $: Wahrscheinlichkeit, dass das Thema $ k $ im Dokument $ d $ zugewiesen wird
$ \ phi_ {kv} $: Wahrscheinlichkeit, dass das Thema $ k $ Vokabeln $ v $ generiert
$ q_ {dnk} $: Wahrscheinlichkeit (Belastungsrate), dass das Thema $ k $ dem $ n $ -ten Wort in Dokument $ d $ zugewiesen wird
E step
Um die unbestimmte Multiplikatormethode von Lagrange zu verwenden, definieren wir $ F_q $ wie folgt.
F_q \equiv \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log \theta_{dk}\phi_{kw_{dn}} - \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log q_{dnk} + \lambda \bigl(\sum^K_{k = 1} q_{dnk} - 1 \bigr) \tag{2}
Unterscheide $ F_q $ teilweise mit $ q_ {dnk} $.
\frac{\partial F_q}{\partial q_{dnk}} = \log \theta_{dk}\phi_{kw_{dn}} - \log q_{dnk} - 1 + \lambda = 0 \tag{3}
Von $ \ frac {\ partiell F_q} {\ partiell q_ {dnk}} = 0 $
q_{dnk} = \exp(\lambda - 1) \theta_{dk}\phi_{kw_{dn}} \tag{4}
Von $ \ sum ^ K_ {k = 1} q_ {dnk} = 1 $
\begin{align}
& \sum^K_{k = 1} \exp(\lambda - 1) \theta_{dk}\phi_{kw_{dn}} = 1 \\
& \exp(\lambda - 1) = \frac{1}{\displaystyle \sum^K_{k = 1} \theta_{dk}\phi_{kw_{dn}}} \tag{5}
\end{align}
Setzen Sie Gleichung (5) in Gleichung (4) ein, um $ q_ {dnk} $ zu erhalten.
q_{dnk} = \frac{\theta_{dk}\phi_{kw_{dn}}}{\displaystyle \sum^K_{k' = 1} \theta_{dk'}\phi_{k'w_{dn}}} \tag{6}
$ q_ {dnk} $ wird als Belastungsfaktor bezeichnet und stellt die Wahrscheinlichkeit dar, dass das Thema $ k $ dem $ n $ -ten Wort im Dokument $ d $ zugewiesen wird.
M step
Im M-Schritt werden die Parameter $ \ boldsymbol \ Theta = (\ boldsymbol \ theta_1, \ cdots, \ theta_D) $ und $ \ boldsymbol \ Phi = (\ phi_1, \ cdots, \ phi_K) $ separat betrachtet. Beide verwenden die unbestimmte Multiplikatormethode von Lagrange wie im E-Schritt.
Um die unbestimmte Multiplikatormethode von Lagrange zu verwenden, definieren wir $ F_ \ theta $ wie folgt.
F_\theta \equiv \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log \theta_{dk}\phi_{kw_{dn}} - \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log q_{dnk} + \lambda \bigl(\sum^K_{k = 1} \theta_{dk} - 1 \bigr) \tag{7}
Unterscheide $ F_ \ theta $ teilweise mit $ \ theta_ {dk} $.
\frac{\partial F_\theta}{\partial \theta_{dk}} = \sum^{N_d}_{n = 1} \frac{q_{dnk}}{\theta_{dk}} + \lambda \tag{8}
Von $ \ frac {\ partiell F_ \ theta} {\ partiell \ theta_ {dk}} = 0 $
\theta_{dk} = - \sum^{N_d}_{n = 1} \frac{q_{dnk}}{\lambda} \tag{9}
Von $ \ sum ^ K_ {k = 1} \ theta_ {dk} = 1 $
\begin{align}
& - \sum^K_{k = 1} \sum^{N_d}_{n = 1} \frac{q_{dnk}}{\lambda} = 1 \\
& \lambda = - \sum^K_{k = 1} \sum^{N_d}_{n = 1} q_{dnk} \tag{10}
\end{align}
Setzen Sie Gleichung (10) in Gleichung (9) ein, um $ \ theta_ {dk} $ zu erhalten.
\theta_{dk} = \frac{\displaystyle \sum^{N_d}_{n = 1} q_{dnk}}{\displaystyle \sum^K_{k' = 1} \sum^{N_d}_{n = 1} q_{dnk'}} \tag{11}
Um die unbestimmte Multiplikatormethode von Lagrange zu verwenden, definieren wir $ F_ \ phi $ wie folgt.
F_\phi \equiv \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log \theta_{dk}\phi_{kw_{dn}} - \sum^D_{d = 1} \sum^{N_d}_{n = 1} \sum^K_{k = 1} q_{dnk} \log q_{dnk} + \lambda \bigl(\sum^V_{v = 1} \phi_{kv} - 1 \bigr) \tag{12}
Unterscheiden Sie $ F_ \ phi $ teilweise mit $ \ phi_ {kv} $.
\frac{\partial F_\phi}{\partial \phi_{kv}} = \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} \frac{q_{dnk}}{\phi_{kv}} + \lambda \tag{13}
Von $ \ frac {\ partiell F_ \ phi} {\ partiell \ phi_ {kv}} = 0 $
\phi_{kv} = - \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} \frac{q_{dnk}}{\lambda} \tag{14}
Von $ \ sum ^ V_ {v = 1} \ phi_ {kv} = 1 $
\begin{align}
& - \sum^V_{v = 1} \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} \frac{q_{dnk}}{\lambda} = 1 \\
& \lambda = - \sum^V_{v = 1} \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} q_{dnk} \tag{15}
\end{align}
Setzen Sie Gleichung (15) in Gleichung (14) ein, um $ \ phi_ {kv} $ zu erhalten.
\phi_{kv} = \frac{\displaystyle \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} q_{dnk}}{\displaystyle \sum^V_{v' = 1} \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v'} q_{dnk}}
Ich habe ein Spielzeugprogramm für die wahrscheinlichste Schätzung des Themenmodells in Python implementiert.
import numpy as np
def normalize(ndarray, axis):
return ndarray / ndarray.sum(axis = axis, keepdims = True)
def normalized_random_array(d0, d1):
ndarray = np.random.rand(d0, d1)
return normalize(ndarray, axis = 1)
if __name__ == "__main__":
# initialize parameters
D, K, V = 1000, 3, 6
theta = normalized_random_array(D, K)
phi = normalized_random_array(K, V)
theta_est = normalized_random_array(D, K)
phi_est = normalized_random_array(K, V)
# for generate documents
_theta = np.array([theta[:, :k+1].sum(axis = 1) for k in range(K)]).T
_phi = np.array([phi[:, :v+1].sum(axis = 1) for v in range(V)]).T
# generate documents
W, Z = [], []
N = np.random.randint(100, 300, D)
for (d, N_d) in enumerate(N):
Z.append((np.random.rand(N_d, 1) < _theta[d, :]).argmax(axis = 1))
W.append((np.random.rand(N_d, 1) < _phi[Z[-1], :]).argmax(axis = 1))
# estimate parameters
q = np.zeros((D, np.max(N), K))
T = 300
likelihood = np.zeros(T)
for t in range(T):
print(t)
# E step
for (d, N_d) in enumerate(N):
q[d, :N_d, :] = normalize(theta_est[d, :] * phi_est[:, W[d]].T, axis = 1)
# M step
theta_est[:, :] = normalize(q.sum(axis = 1), axis = 1)
q_sum = np.zeros((K, V))
for (d, W_d) in enumerate(W):
v, index, count = np.unique(W_d, return_index= True, return_counts = True)
q_sum[:, v[:]] += count[:] * q[d, index[:], :].T
phi_est[:, :] = normalize(q_sum, axis = 1)
# likelihood
for (d, W_d) in enumerate(W):
likelihood[t] += np.log(theta_est[d, :].dot(phi_est[:, W_d])).sum()
# perplexity
perplexity = np.exp(-likelihood[:] / N.sum())
Das Ergebnis der Ausführung des implementierten Codes wird angezeigt. Wieder ist jeder Parameter wie folgt.
Die als wahre Wortverteilung geschätzte Wortverteilung ist unten gezeigt.
phi
[[ 0.06837655 0.2294022 0.29048815 0.01610669 0.31437584 0.08125057]
[ 0.19902324 0.19283392 0.0251427 0.23391767 0.10622823 0.24285424]
[ 0.04165762 0.30678289 0.2579833 0.00882557 0.25580282 0.12894781]]
phi_est
[[ 0.04572686 0.20003413 0.33589344 0.00282668 0.36368718 0.0518317 ]
[ 0.20342652 0.16884355 0.04403442 0.23473554 0.12226066 0.22669932]
[ 0.05439782 0.37614278 0.18788228 0.01364525 0.18248741 0.18544446]]
Ein Diagramm der logarithmischen Wahrscheinlichkeit wird angezeigt. Die logarithmische Wahrscheinlichkeit wird nach der folgenden Formel berechnet.
\begin{align}
likelihood &= \sum^D_{d = 1} \log p(\boldsymbol w_d \ | \ M) \\
&= \sum^D_{d = 1} \log \prod^{N_d}_{n = 1} \sum^K_{k = 1} \theta_{dk} \phi_{kw_{dn}}
\end{align}
Das Diagramm der Ratlosigkeit wird gezeigt.
perplexity = \exp\Biggl(- \frac{\displaystyle \sum^D_{d = 1} \log p(\boldsymbol w_d \ | \ M)}{\displaystyle \sum^D_{d = 1} N_d}\Biggr)
Wir konnten die wahrscheinlichste Schätzung des Themenmodells implementieren. Als nächstes werde ich ** LDA ** versuchen.
Recommended Posts