J'ai essayé d'implémenter PLSA en Python

Aperçu

--J'ai implémenté PLSA (Probabilistic Latent Semantic Analysis) en Python.

Qu'est-ce que PLSA

Une des méthodes de clustering

  1. Le document d est sélectionné par P (d)
  2. Le thème z est sélectionné par P (z | d)
  3. Le mot w est généré par P (w | z)

C'est un modèle appelé. Dans la formule

P(d,w) = P(d)\sum_{z}P(z|d)P(w|z)

Cependant, il est légèrement déformé

P(d,w) = \sum_{z}P(z)P(d|z)P(w|z)

Je traite souvent avec.

Consigner la probabilité pour ce modèle

L = \sum_{d}\sum_{w}N(d,w)\log P(d,w)

Est le maximumP(z), P(d|z), P(w|z)Est calculé à l'aide de l'algorithme EM. «N (d, w)» est le nombre de fois où le mot w apparaît dans le document d.

Algorithme EM

Répétez les étapes E et M suivantes jusqu'à ce que la probabilité logarithmique converge.

--E étape

P(z|d,w) = \frac{P\left( z \right)P\left( d | z \right)P\left( w | z \right)}{\sum_{z} P\left( z \right)P\left( d | z \right)P\left( w | z \right)}

--M étape

\begin{eqnarray}
P\left( z \right) & = & \frac{\sum_{d} \sum_{w} N_{d, w} P\left( z | d, w \right)}{\sum_{d} \sum_{w} N_{d, w}} \\
P\left( d | z \right) & = & \frac{\sum_{w} N_{d, w} P \left( z | d, w \right)}{\sum_{d} \sum_{w} N_{d, w} P \left( z | d, w \right)} \\
P\left( w | z \right) & = & \frac{\sum_{d} N_{d, w} P \left( z | d, w \right)}{\sum_{d} \sum_{w} N_{d, w} P \left( z | d, w \right)}
\end{eqnarray}

la mise en oeuvre

Avec l'idée qu'il peut être utilisé pour d'autres que des documents et des mots

P(x,y) = \sum_{z}P(z)P(x|z)P(y|z)

C'est dit.

plsa.py


import numpy as np


class PLSA(object):
    def __init__(self, N, Z):
        self.N = N
        self.X = N.shape[0]
        self.Y = N.shape[1]
        self.Z = Z

        # P(z)
        self.Pz = np.random.rand(self.Z)
        # P(x|z)
        self.Px_z = np.random.rand(self.Z, self.X)
        # P(y|z)
        self.Py_z = np.random.rand(self.Z, self.Y)

        #Normalisation
        self.Pz /= np.sum(self.Pz)
        self.Px_z /= np.sum(self.Px_z, axis=1)[:, None]
        self.Py_z /= np.sum(self.Py_z, axis=1)[:, None]

    def train(self, k=200, t=1.0e-7):
        '''
Répétez les étapes E et M jusqu'à ce que la probabilité logarithmique converge
        '''
        prev_llh = 100000
        for i in xrange(k):
            self.e_step()
            self.m_step()
            llh = self.llh()

            if abs((llh - prev_llh) / prev_llh) < t:
                break

            prev_llh = llh

    def e_step(self):
        '''
Étape E
        P(z|x,y)Mise à jour
        '''
        self.Pz_xy = self.Pz[None, None, :] \
            * self.Px_z.T[:, None, :] \
            * self.Py_z.T[None, :, :]
        self.Pz_xy /= np.sum(self.Pz_xy, axis=2)[:, :, None]

    def m_step(self):
        '''
Étape M
        P(z), P(x|z), P(y|z)Mise à jour
        '''
        NP = self.N[:, :, None] * self.Pz_xy

        self.Pz = np.sum(NP, axis=(0, 1))
        self.Px_z = np.sum(NP, axis=1).T
        self.Py_z = np.sum(NP, axis=0).T

        self.Pz /= np.sum(self.Pz)
        self.Px_z /= np.sum(self.Px_z, axis=1)[:, None]
        self.Py_z /= np.sum(self.Py_z, axis=1)[:, None]

    def llh(self):
        '''
Probabilité du journal
        '''
        Pxy = self.Pz[None, None, :] \
            * self.Px_z.T[:, None, :] \
            * self.Py_z.T[None, :, :]
        Pxy = np.sum(Pxy, axis=2)
        Pxy /= np.sum(Pxy)

        return np.sum(self.N * np.log(Pxy))

Je l'utilise comme ça. Des exemples sont X = 5, Y = 4, Z = 2.

import numpy as np
from plsa import PLSA


N = np.array([
    [20, 23, 1, 4],
    [25, 19, 3, 0],
    [2, 1, 31, 28],
    [0, 1, 22, 17],
    [1, 0, 18, 24]
])

plsa = PLSA(N, 2)
plsa.train()

print 'P(z)'
print plsa.Pz
print 'P(x|z)'
print plsa.Px_z
print 'P(y|z)'
print plsa.Py_z
print 'P(z|x)'
Pz_x = plsa.Px_z.T * plsa.Pz[None, :]
print Pz_x / np.sum(Pz_x, axis=1)[:, None]
print 'P(z|y)'
Pz_y = plsa.Py_z.T * plsa.Pz[None, :]
print Pz_y / np.sum(Pz_y, axis=1)[:, None]

résultat


P(z)
[ 0.3904831  0.6095169]
P(x|z)
[[  4.62748437e-01   5.01515512e-01   2.44650515e-02   1.11544339e-02   1.16565226e-04]
 [  3.16718954e-02   1.99625810e-09   4.08159551e-01   2.66294583e-01   2.93873968e-01]]
P(y|z)
[[  4.92518417e-01   4.69494935e-01   3.79855484e-02   1.09954245e-06]
 [  1.25999484e-02   5.73485868e-06   4.88365926e-01   4.99028390e-01]]
P(z|x)
[[  9.03477222e-01   9.65227775e-02]
 [  9.99999994e-01   6.21320706e-09]
 [  3.69800871e-02   9.63019913e-01]
 [  2.61337075e-02   9.73866292e-01]
 [  2.54046982e-04   9.99745953e-01]]
P(z|y)
[[  9.61600593e-01   3.83994074e-02]
 [  9.99980934e-01   1.90663270e-05]
 [  4.74646871e-02   9.52535313e-01]
 [  1.41157067e-06   9.99998588e-01]]

Impressions

Recommended Posts

J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé d'implémenter le tri sélectif en python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter GA (algorithme génétique) en Python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
J'ai essayé d'implémenter PCANet
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'implémenter la régression linéaire bayésienne par échantillonnage de Gibbs en python
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé de représenter graphiquement les packages installés en Python
Je veux facilement implémenter le délai d'expiration en python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé d'implémenter Deep VQE
J'ai essayé de toucher Python (installation)
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé d'implémenter Realness GAN
J'ai essayé la notification de ligne en Python
J'ai essayé d'implémenter ce qui semble être un outil de snipper Windows avec Python
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'implémenter Autoencoder avec TensorFlow
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'utiliser l'optimisation bayésienne de Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter CVAE avec PyTorch
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de toucher Python (syntaxe de base)
[Python] J'ai essayé d'implémenter un tri stable, alors notez
J'ai essayé Python> autopep8
Mettre en œuvre des recommandations en Python
Implémenter XENO avec python
J'ai essayé de déboguer.
Implémenter sum en Python
J'ai essayé Python> décorateur
Implémenter Traceroute dans Python 3
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
Je veux faire le test de Dunnett en Python
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
Python: j'ai pu récurer en lambda
Je veux créer une fenêtre avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
Comment implémenter la mémoire partagée en Python (mmap.mmap)
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai écrit "Introduction à la vérification des effets" en Python