Implémentation d'estimation la plus probable du modèle de sujet en python

introduction

Implémentation de l'estimation la plus probable du modèle de sujet en python. En tant que manuel [Topic model](https://www.amazon.co.jp/ Topic model-Machine learning professional series-Iwata-Guji / dp / 4061529048 / ref = sr_1_2? Ie = UTF8 & qid = 1501997285 & sr = 8-2 & keywords = Modèle de sujet) a été utilisé.

Structure de cet article

Modèle de sujet

Le modèle de rubrique suppose qu'un document comporte plusieurs rubriques.

** Exemple ** Article sur "Délibération de projet de loi médicale" => Deux thèmes, "médical" et "politique" Article sur "Effets économiques des Jeux Olympiques" => Deux thèmes, "Sports" et "Economie"

Pour mieux exprimer l'hypothèse qu'un document comporte plusieurs sujets Définissez la distribution des rubriques $ \ boldsymbol \ theta_d = (\ theta_ {d1}, \ cdots, \ theta_ {dK}) $ pour chaque document. $ \ theta_ {dk} = p (k \ | \ \ boldsymbol \ theta_d) $ est la probabilité que le sujet $ k $ soit affecté à un mot du document $ d $. Le sujet $ z_ {dn} $ est assigné à chaque mot du document $ d $ selon la distribution de sujet $ \ boldsymbol \ theta_d $. Les mots sont générés selon la distribution des mots $ \ boldsymbol \ phi_ {z_ {dn}} $ du sujet assigné. $ \ boldsymbol \ phi_k = (\ phi_ {k1}, \ cdots, \ phi_ {kV}) $ représente la probabilité que le sujet $ k $ génère le vocabulaire $ v $.

La figure ci-dessous montre le processus de génération d'un ensemble spécifique de documents.

topic_model.png

Un thème est attribué à chaque mot et les mots sont générés à partir de la distribution des mots en fonction de ce thème. Au milieu de la figure, il y a une forte probabilité que les thèmes «sports» et «économie» soient attribués. De nombreux mots liés à ces deux sujets sont observés. En regardant la distribution des mots des sujets économiques, par ordre décroissant de probabilité de génération Il est aligné avec «économie», «cours des actions», «économie» et «yen fort».

Analyse probabiliste de la signification latente

La méthode d'estimation du modèle thématique le plus probable est appelée ** analyse probabiliste de la signification latente ** (** PLSA ). À propos, l'estimation bayésienne du modèle thématique est une méthode appelée ** modèle d'allocation de diricle latent ** ( LDA **).

PLSA utilise l'algorithme EM pour estimer le modèle de sujet le plus probable. Les paramètres suivants qui maximisent la probabilité du journal $ \ boldsymbol \ Theta = (\ boldsymbol \ theta_1, \ cdots, \ boldsymbol \ theta_D) $ et $ \ boldsymbol \ Phi = (\ boldsymbol \ phi_1, \ cdots, \ boldsymbol \ phi_K) Trouvez $.

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

Utilisez l'algorithme EM pour maximiser la borne inférieure $ F $. Ci-dessous, nous allons développer la formule en la divisant en ** E étape ** et ** M étape **.

E step

Pour utiliser la méthode du multiplicateur indéterminé de Lagrange, nous définissons $ F_q $ comme suit.

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}

Différenciez partiellement $ F_q $ avec $ q_ {dnk} $.

\frac{\partial F_q}{\partial q_{dnk}} = \log \theta_{dk}\phi_{kw_{dn}} - \log q_{dnk} - 1 + \lambda = 0 \tag{3}

De $ \ frac {\ partial F_q} {\ partial q_ {dnk}} = 0 $

q_{dnk} = \exp(\lambda - 1) \theta_{dk}\phi_{kw_{dn}} \tag{4}

De $ \ 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}

Remplacez l'équation (5) par l'équation (4) pour obtenir $ q_ {dnk} $.

q_{dnk} = \frac{\theta_{dk}\phi_{kw_{dn}}}{\displaystyle \sum^K_{k' = 1} \theta_{dk'}\phi_{k'w_{dn}}} \tag{6}

$ q_ {dnk} $ est appelé le facteur de charge et représente la probabilité que le sujet $ k $ soit attribué au $ n $ ème mot du document $ d $.

M step

A l'étape M, les paramètres $ \ boldsymbol \ Theta = (\ boldsymbol \ theta_1, \ cdots, \ theta_D) $ et $ \ boldsymbol \ Phi = (\ phi_1, \ cdots, \ phi_K) $ sont considérés séparément. Les deux utilisent la méthode du multiplicateur indéterminé de Lagrange comme dans l'étape E.

Distribution des sujets

Pour utiliser la méthode du multiplicateur indéterminé de Lagrange, nous définissons $ F_ \ theta $ comme suit.

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}

Différenciez partiellement $ F_ \ theta $ avec $ \ theta_ {dk} $.

\frac{\partial F_\theta}{\partial \theta_{dk}} = \sum^{N_d}_{n = 1} \frac{q_{dnk}}{\theta_{dk}} + \lambda \tag{8}

De $ \ frac {\ partial F_ \ theta} {\ partial \ theta_ {dk}} = 0 $

\theta_{dk} = - \sum^{N_d}_{n = 1} \frac{q_{dnk}}{\lambda} \tag{9}

De $ \ 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}

Remplacez l'équation (10) par l'équation (9) pour obtenir $ \ theta_ {dk} $.

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

Distribution de mots

Pour utiliser la méthode du multiplicateur indéterminé de Lagrange, nous définissons $ F_ \ phi $ comme suit.

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}

Différenciez partiellement $ F_ \ phi $ avec $ \ 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}

De $ \ frac {\ partial F_ \ phi} {\ partial \ phi_ {kv}} = 0 $

\phi_{kv} = - \sum^D_{d = 1} \sum^{}_{n:w_{dn} = v} \frac{q_{dnk}}{\lambda} \tag{14}

De $ \ 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}

Remplacez l'équation (15) par l'équation (14) pour obtenir $ \ phi_ {kv} $.

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

la mise en oeuvre

J'ai implémenté un programme jouet pour l'estimation la plus probable du modèle de sujet en python.

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

résultat

Le résultat de l'exécution du code implémenté est affiché. Là encore, chaque paramètre est le suivant.

La distribution des mots estimée comme la vraie distribution des mots est indiquée ci-dessous.

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

Un graphique de vraisemblance logarithmique est présenté. La vraisemblance logarithmique est calculée par la formule suivante.

\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

Le graphique de la perplexité est montré.

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

en conclusion

Nous avons pu mettre en œuvre l'estimation la plus probable du modèle thématique. Ensuite, j'essaierai ** LDA **.

Recommended Posts

Implémentation d'estimation la plus probable du modèle de sujet en python
Implémentation d'estimation bayésienne de variante du modèle de sujet en python
Implémentation du tri rapide en Python
Implémentation de l'estimation des paramètres HMM en python
Implémentation du jeu de vie en Python
Implémentation du tri original en Python
Avantages et inconvénients de la méthode d'estimation la plus probable
PRML Chapter 13 Estimation la plus probable Implémentation Python du modèle de Markov caché
Implémentation Python du modèle Markov caché continu
Exemple de code python pour la distribution exponentielle et l'estimation la plus probable (MLE)
J'ai essayé d'implémenter TOPIC MODEL en Python
Estimation la plus probable de diverses distributions avec Pyro
Explication de la distance d'édition et de l'implémentation en Python
Implémentation RNN en python
Implémentation ValueObject en Python
Implémentation SVM en python
Essayons à nouveau Estimation de la plupart des probabilités et ajustement du modèle (distribution de probabilité) ① Distribution de probabilité discrète
Essayons à nouveau La plupart des estimations de probabilité et ajustement du modèle (distribution de probabilité) ② Distribution de probabilité continue
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
Estimation la plus probable de la moyenne et de la variance avec TensorFlow
Un mémorandum sur la mise en œuvre des recommandations en Python
Implémentation du modèle de sujet d'espace continu
Visualiser le modèle Keras avec Python 3.5
Estimation de la densité du noyau en Python
Jugement d'équivalence d'objet en Python
Implémentation Python du filtre à particules
Implémentation de réseau neuronal en python
Nombre maximum de caractères dans l'appel shell Python3 (par OS)
Manipulation des pixels d'image en Python
Algorithme de tri et implémentation en Python
Implémentation Python du filtre à particules auto-organisateur
Implémentation de distribution normale mixte en python
Implémentation de la fonction de connexion dans Django
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Méthode du carré minimum et méthode d'estimation la plus probable (comparaison par ajustement du modèle)
Gestion des fichiers JSON en Python
Affichage de la forme d'onde audio en Python
Implémentation des notifications de bureau à l'aide de Python
Implémentation Python de l'arborescence de segments non récursive
Diagramme PRML Figure 1.15 Biais dans l'estimation la plus probable de la distribution gaussienne
Modèle d'espace d'état gaussien général en Python
Implémentation de Light CNN (Python Keras)
La loi des nombres en python
Implémentation de la méthode Dyxtra par python
Brouillage réversible d'entiers en Python
Projet Euler # 4 "Calligraphie maximum" en Python
Modèle d'espace d'états personnalisé en Python
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
Implémentation du filtre à particules par Python et application au modèle d'espace d'états
Explication du modèle d'optimisation de la production par Python
Conversion de la chaîne <-> date (date, datetime) en Python
Projet Euler # 3 "Maximum Prime Factors" en Python
Vérifiez le comportement du destroyer en Python
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Projet Euler # 11 "Produit maximum dans la grille" en Python
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
PRML Chapitre 14 Implémentation Python de modèle mixte conditionnel