On considère ici le cas de requêtes à un serveur. A chaque instant, on a une taille de requête en bits et on assiste a une série disparate de requêtes sur le serveur qu'on aimerait bien analyser pour comprendre à quels types de "clients" le serveur est confronté. Tout ceci est discuté en détail ici. Le fichier accessible ici propose les longueurs de ces requêtes en bits (deuxième colonne) en fonction du temps en seconde (première colonne). Voila l'affichage de la colonne 2 en fonction de la colonne 1 (taille de la requête en fonction du temps):
L'histogramme des requêtes nous montre qu'il doit y avoir plusieurs types de requêtes ...
On construit un algorithme EM d'après le cours. La solution en scilab est ici. Dans ce programme,
on simule un mélange de Poisson avec les paramètres grossièrement estimés d'après les histogrammes des données de réseau précédentes.
on prend le log des données sinon, le calcul des tau_ik devient explosif.
on multiplie ensuite par 10 histoire de les séparer les espérances suffisamment (quand on ne multiplie pas par 10, la méthode met toutes les proba a 0 sauf pour une classe et agrège donc toutes les classes).
Le programme proposé exploite l'expression matricielle simple de tau et évite ainsi la lourdeur des boucles "for", ce qui donne au final une méthode assez rapide. On constate après 100 itérations que la log-vraisemblance n'augmente plus et qu'on semble avoir convergé vers les bonnes valeurs. Ceci est confirmé en tapant [lambda,lambda0] et [Pi,Pi0] pour comparer estimateur et paramètres utilisés pour la simulation. Un article discutant d'une implémentation dite "online" beaucoup plus rapide est accessible ici.