J'essaie de bien comprendre l'algorithme EM, de pouvoir l'implémenter et de l'utiliser. J'ai passé une journée entière à lire la théorie et un article dans lesquels EM est utilisé pour suivre un avion en utilisant les informations de position provenant d'un radar. Honnêtement, je ne pense pas comprendre parfaitement l’idée sous-jacente. Quelqu'un peut-il m'indiquer un exemple numérique montrant quelques itérations (3-4) de l'EM pour un problème plus simple (comme l'estimation des paramètres d'une distribution gaussienne ou d'une séquence d'une série sinusoïdale ou l'ajustement d'une ligne).
Même si quelqu'un peut m'indiquer un morceau de code (avec des données synthétiques), je peux essayer de le parcourir.
regression
probability
mathematical-statistics
intuition
expectation-maximization
arjsgh21
la source
la source
Réponses:
Voici une recette pour apprendre la SE avec un exemple pratique et (à mon avis) très intuitif:
Lisez ce court didacticiel sur l’EM de Do et Batzoglou. C'est le schéma où l'exemple de tirage au sort est expliqué:
Vous avez peut-être des points d'interrogation dans la tête, notamment en ce qui concerne l'origine des probabilités de l'étape des attentes. Veuillez consulter les explications de cette page d’ échange de piles mathématiques .
Regardez / exécutez ce code que j'ai écrit en Python et qui simule la solution au problème du tirage au sort dans l'article du didacticiel sur la ME du point 1:
la source
pA_heads[j+1]
etpA_heads[j]
et 2) le changement entrepB_heads[j+1]
etpB_heads[j]
. Et cela prend le maximum des deux changements. Par exemple, siDelta_A=0.001
etDelta_B=0.02
, l'amélioration de l'étapej
àj+1
sera0.02
.delta
.Il semble que votre question comporte deux parties: l’idée sous-jacente et un exemple concret. Je vais commencer par l'idée sous-jacente, puis un lien vers un exemple en bas.
Le cas le plus courant auquel les gens s’occupent est probablement les distributions mixtes. Pour notre exemple, examinons un modèle de mélange gaussien simple:
Et maintenant tu es coincé:
Si vous connaissiez le vrai moyen, vous pourriez déterminer quels points de données provenaient de quel gaussien. Par exemple, si un point de données a une valeur très élevée, il provient probablement de la distribution avec la moyenne la plus élevée. Mais vous ne savez pas quels sont les moyens, alors cela ne fonctionnera pas.
Si vous saviez de quelle distribution provenait chaque point, vous pourriez alors estimer la moyenne des deux distributions à l'aide de la moyenne d'échantillonnage des points pertinents. Mais vous ne savez pas réellement quels points attribuer à quelle distribution, cela ne fonctionnera donc pas non plus.
Donc, aucune de ces approches ne semble fonctionner: vous auriez besoin de connaître la réponse avant de pouvoir trouver la réponse, et vous êtes bloqué.
Ce que vous permet de faire est d’alterner entre ces deux étapes faciles au lieu de s’occuper de tout le processus à la fois.
Vous devrez commencer par deviner les deux moyens (bien que votre estimation ne doive pas nécessairement être très précise, vous devez commencer quelque part).
Si votre hypothèse concernant les moyennes était exacte, vous auriez alors suffisamment d'informations pour exécuter l'étape de mon premier point ci-dessus, et vous pourriez (probablement) attribuer chaque point de données à l'un des deux Gaussiens. Même si nous savons que notre hypothèse est fausse, essayons quand même. Et puis, étant donné les distributions attribuées à chaque point, vous pouvez obtenir de nouvelles estimations pour les moyennes en utilisant le deuxième point. Il s'avère que chaque fois que vous parcourez ces deux étapes, vous améliorez la limite inférieure de la probabilité du modèle.
C'est déjà assez cool: même si les deux suggestions dans les points ci-dessus ne semblaient pas fonctionner individuellement, vous pouvez toujours les utiliser ensemble pour améliorer le modèle. La vraie magie de l'EM est que, après suffisamment d'itérations, la limite inférieure sera si élevée qu'il n'y aura plus d'espace entre elle et le maximum local. En conséquence, et vous avez optimisé localement la probabilité.
Ainsi, vous n'avez pas seulement amélioré le modèle, vous avez trouvé le meilleur modèle possible avec les mises à jour incrémentielles.
Cette page de Wikipedia montre un exemple un peu plus compliqué (Gaussiennes à deux dimensions et covariance inconnue), mais l’idée de base est la même. Il inclut également du
R
code bien commenté pour implémenter l'exemple.Dans le code, l'étape "Expectation" (étape E) correspond à mon premier point: déterminer quel gaussien assume la responsabilité de chaque point de données, compte tenu des paramètres actuels de chaque gaussien. L'étape "Maximisation" (étape M) met à jour les moyennes et les covariances, compte tenu de ces affectations, comme dans mon deuxième point.
Comme vous pouvez le constater dans l'animation, ces mises à jour permettent rapidement à l'algorithme de passer d'un ensemble d'estimations terribles à un ensemble d'excellentes: il semble vraiment y avoir deux nuages de points centrés sur les deux distributions gaussiennes trouvées par EM.
la source
Voici un exemple d'optimisation des attentes (EM) utilisé pour estimer la moyenne et l'écart type. Le code est en Python, mais il devrait être facile à suivre même si vous n'êtes pas familier avec le langage.
La motivation pour l'EM
Les points rouges et bleus ci-dessous sont tirés de deux distributions normales différentes, chacune avec une moyenne et un écart type particuliers:
Pour calculer des approximations raisonnables des paramètres "vrais" de moyenne et d'écart type pour la distribution rouge, nous pourrions très facilement examiner les points rouges et enregistrer la position de chacun d'eux, puis utiliser les formules familières (et de la même manière pour le groupe bleu). .
Considérons maintenant le cas où nous savons qu’il existe deux groupes de points, mais nous ne pouvons pas voir quel point appartient à quel groupe. En d'autres termes, les couleurs sont cachées:
Il n’est pas du tout évident de diviser les points en deux groupes. Nous ne sommes plus en mesure de regarder les positions et de calculer des estimations pour les paramètres de la distribution rouge ou de la distribution bleue.
C’est là que l’EM peut être utilisé pour résoudre le problème.
Utiliser EM pour estimer les paramètres
Voici le code utilisé pour générer les points indiqués ci-dessus. Vous pouvez voir les moyennes et les écarts-types réels des distributions normales à partir desquelles les points ont été tirés. Les variables
red
etblue
tiennent les positions de chaque point dans les groupes rouge et bleu respectivement:Si nous pouvions voir la couleur de chaque point, nous essaierions de récupérer les moyennes et les écarts-types à l'aide des fonctions de la bibliothèque:
Mais puisque les couleurs nous sont cachées, nous allons commencer le processus EM ...
Premièrement, nous devinons simplement les valeurs des paramètres de chaque groupe ( étape 1 ). Ces suppositions ne doivent pas forcément être bonnes:
Assez mauvaises conjectures - les moyens semblent être loin du "milieu" d'un groupe de points.
Pour continuer avec EM et améliorer ces suppositions, nous calculons la probabilité que chaque point de données (quelle que soit sa couleur secrète) apparaisse sous ces suppositions pour la moyenne et l'écart type ( étape 2 ).
La variable
both_colours
contient chaque point de données. La fonctionstats.norm
calcule la probabilité du point sous une distribution normale avec les paramètres donnés:Cela nous indique, par exemple, qu’avec nos suppositions actuelles, le point de données situé à 1,761 est beaucoup plus susceptible d’être rouge (0,189) que bleu (0,00003).
Nous pouvons transformer ces deux valeurs de vraisemblance en pondérations ( étape 3 ) afin qu'elles totalisent 1 comme suit:
Avec nos estimations actuelles et nos poids nouvellement calculés, nous pouvons maintenant calculer de nouvelles estimations, probablement meilleures, pour les paramètres ( étape 4 ). Nous avons besoin d’une fonction pour la moyenne et d’une fonction pour l’écart type:
Celles-ci ressemblent beaucoup aux fonctions habituelles à la moyenne et à l'écart type des données. La différence est l'utilisation d'un
weight
paramètre qui attribue une pondération à chaque point de données.Cette pondération est la clé de la SE. Plus le poids d'une couleur sur un point de données est important, plus le point de données influence les estimations suivantes pour les paramètres de cette couleur. En fin de compte, cela a pour effet de tirer chaque paramètre dans la bonne direction.
Les nouvelles suppositions sont calculées avec ces fonctions:
Le processus EM est ensuite répété avec ces nouvelles suppositions à partir de l'étape 2. Nous pouvons répéter les étapes pour un nombre donné d'itérations (par exemple 20) ou jusqu'à ce que les paramètres convergent.
Après cinq itérations, nous voyons que nos mauvaises hypothèses initiales commencent à s’améliorer:
Après 20 itérations, le processus EM a plus ou moins convergé:
À des fins de comparaison, voici les résultats du processus EM comparés aux valeurs calculées pour lesquelles les informations de couleur ne sont pas masquées:
Remarque: cette réponse a été adaptée de ma réponse sur Stack Overflow ici .
la source
Suite à la réponse de Zhubarb, j'ai implémenté l'exemple EM "Lancer de la monnaie" de Do et Batzoglou dans GNU R. Notez que j'utilise la
mle
fonction dustats4
package - cela m'a aidé à comprendre plus clairement le lien entre EM et MLE.la source
Tout ce qui précède semble être une excellente ressource, mais je dois faire un lien avec ce bel exemple. Il présente une explication très simple pour trouver les paramètres de deux lignes d’un ensemble de points. Le tutoriel est de Yair Weiss au MIT.
http://www.cs.huji.ac.il/~yweiss/emTutorial.pdf
http://www.cs.huji.ac.il/~yweiss/tutorials.html
la source
La réponse donnée par Zhubarb est excellente, mais malheureusement, elle l’est en python. Ci-dessous, une implémentation Java de l'algorithme EM exécuté sur le même problème (posée dans l'article de Do et Batzoglou, 2008). J'ai ajouté quelques printf à la sortie standard pour voir comment les paramètres convergent.
Le code Java suit ci-dessous:
la source
la source
Eh bien, je vous suggérerais de lire un livre sur R de Maria L. Rizzo. L'un des chapitres contient l'utilisation de l'algorithme EM avec un exemple numérique. Je me souviens d’avoir parcouru le code pour une meilleure compréhension.
Aussi, essayez de le voir du point de vue du clustering au début. Élaborez à la main un problème de regroupement où 10 observations sont prises à partir de deux densités normales différentes. Cela devrait aider. Prenez l’aide de R :)
la source
la source