Höchstwahrscheinlich Schätzungsimplementierung des Themenmodells in Python

Einführung

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

Themenmodell

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.

topic_model.png

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".

Probabilistische Analyse der latenten Bedeutung

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.

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.

Themenverteilung

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}

Wortverteilung

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}}

Implementierung

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())

Ergebnis

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}
likelihood.png

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)
perplexity.png

abschließend

Wir konnten die wahrscheinlichste Schätzung des Themenmodells implementieren. Als nächstes werde ich ** LDA ** versuchen.

Recommended Posts

Höchstwahrscheinlich Schätzungsimplementierung des Themenmodells in Python
Implementierung der Bayes'schen Varianzschätzung des Themenmodells in Python
Implementierung der schnellen Sortierung in Python
Implementierung der HMM-Parameterschätzung in Python
Implementierung eines Lebensspiels in Python
Implementierung der ursprünglichen Sortierung in Python
Vor- und Nachteile der wahrscheinlichsten Schätzmethode
PRML Kapitel 13 Wahrscheinlichste Schätzung Python-Implementierung des Hidden-Markov-Modells
Python-Implementierung eines kontinuierlichen Hidden-Markov-Modells
Beispiel für Python-Code für die Exponentialverteilung und die wahrscheinlichste Schätzung (MLE)
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Höchstwahrscheinlich Schätzung verschiedener Verteilungen mit Pyro
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
RNN-Implementierung in Python
ValueObject-Implementierung in Python
SVM-Implementierung in Python
Versuchen wir es noch einmal. Wahrscheinlichste Schätzung und Anpassung des Modells (Wahrscheinlichkeitsverteilung) ① Diskrete Wahrscheinlichkeitsverteilung
Versuchen wir es noch einmal. Schätzung der meisten Wahrscheinlichkeiten und Anpassung des Modells (Wahrscheinlichkeitsverteilung) ② Kontinuierliche Wahrscheinlichkeitsverteilung
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
Höchstwahrscheinlich Schätzung des Mittelwerts und der Varianz mit TensorFlow
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Kontinuierliche Implementierung des Weltraumthemenmodells
Visualisieren Sie das Keras-Modell mit Python 3.5
Schätzung der Kerneldichte in Python
Objektäquivalenzbeurteilung in Python
Python-Implementierung des Partikelfilters
Implementierung eines neuronalen Netzwerks in Python
Maximale Anzahl von Zeichen im Python3-Shell-Aufruf (pro Betriebssystem)
Bildpixel-Manipulation in Python
Sortieralgorithmus und Implementierung in Python
Python-Implementierung eines selbstorganisierenden Partikelfilters
Implementierung einer gemischten Normalverteilung in Python
Implementierung der Login-Funktion in Django
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Minimum-Square-Methode und wahrscheinlichste Schätzmethode (Vergleich durch Modellanpassung)
Umgang mit JSON-Dateien in Python
Audio-Wellenform-Anzeige in Python
Implementierung von Desktop-Benachrichtigungen mit Python
Python-Implementierung eines nicht rekursiven Segmentbaums
PRML-Diagramm Abbildung 1.15 Verzerrung bei der Schätzung der wahrscheinlichsten Wahrscheinlichkeit der Gaußschen Verteilung
Allgemeines Gaußsches Zustandsraummodell in Python
Implementierung von Light CNN (Python Keras)
Das Gesetz der Zahlen in Python
Implementierung der Dyxtra-Methode durch Python
Reversibles Verwürfeln von Ganzzahlen in Python
Projekt Euler # 4 "Maximale Kalligraphie" in Python
Benutzerdefiniertes Zustandsraummodell in Python
Implementierung der benutzerdefinierten Authentifizierungsfunktion für Benutzermodelle in Django REST Framework mit djoser
Implementierung des Partikelfilters durch Python und Anwendung auf das Zustandsraummodell
Erklärung des Produktionsoptimierungsmodells durch Python
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
Projekt Euler # 3 "Maximale Primfaktoren" in Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Übung, dies in Python zu verwenden (schlecht)
Allgemeine Relativitätstheorie in Python: Einführung
Projekt Euler # 11 "Maximales Produkt im Raster" in Python
Ausgabebaumstruktur von Dateien in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
PRML Kapitel 14 Bedingte gemischte Modell-Python-Implementierung