Estoy tratando de comprender bien el algoritmo EM, para poder implementarlo y usarlo. Pasé un día completo leyendo la teoría y un documento donde se usa EM para rastrear un avión utilizando la información de posición proveniente de un radar. Honestamente, no creo entender completamente la idea subyacente. ¿Puede alguien señalarme un ejemplo numérico que muestre algunas iteraciones (3-4) del EM para un problema más simple (como estimar los parámetros de una distribución gaussiana o una secuencia de una serie sinusoidal o ajustar una línea).
Incluso si alguien puede señalarme un fragmento de código (con datos sintéticos), puedo intentar pasar por el código.
Respuestas:
Esta es una receta para aprender EM con un ejemplo práctico y (en mi opinión) muy intuitivo de 'Coin-Toss':
Lea este breve documento tutorial de EM de Do y Batzoglou. Este es el esquema donde se explica el ejemplo de lanzamiento de moneda:
Es posible que tenga signos de interrogación en su cabeza, especialmente con respecto a de dónde provienen las probabilidades en el paso Expectativa. Por favor, eche un vistazo a las explicaciones en esta página de intercambio de pila de matemáticas .
Mire / ejecute este código que escribí en Python que simula la solución al problema del lanzamiento de monedas en el documento tutorial EM del artículo 1:
fuente
pA_heads[j+1]
ypA_heads[j]
y 2) el cambio entrepB_heads[j+1]
ypB_heads[j]
. Y toma el máximo de los dos cambios. Por ejemplo, siDelta_A=0.001
yDelta_B=0.02
, la mejora de pasoj
a pasoj+1
será0.02
.delta
.Parece que su pregunta tiene dos partes: la idea subyacente y un ejemplo concreto. Comenzaré con la idea subyacente, luego vincularé a un ejemplo en la parte inferior.
EM es útil en situaciones de Catch-22 donde parece que lo que necesita saber antes de poder calcular y lo que necesita saber antes de poder calcular .B B AA B B A
El caso más común con el que las personas lidian es probablemente la distribución de mezclas. Para nuestro ejemplo, veamos un modelo simple de mezcla gaussiana:
Y ahora estás atrapado:
Si supiera los medios verdaderos, podría averiguar qué puntos de datos provienen de qué Gaussian. Por ejemplo, si un punto de datos tenía un valor muy alto, probablemente provenía de la distribución con la media más alta. Pero no sabes cuáles son los medios, así que esto no funcionará.
Si supiera de qué distribución proviene cada punto, entonces podría estimar las medias de las dos distribuciones utilizando las medias de muestra de los puntos relevantes. Pero en realidad no sabe qué puntos asignar a qué distribución, por lo que tampoco funcionará.
Entonces, ninguno de los enfoques parece funcionar: necesitaría saber la respuesta antes de poder encontrar la respuesta, y está atascado.
Lo que EM le permite hacer es alternar entre estos dos pasos manejables en lugar de abordar todo el proceso a la vez.
Deberá comenzar con una conjetura sobre los dos medios (aunque su conjetura no necesariamente tiene que ser muy precisa, debe comenzar en algún lugar).
Si su suposición sobre los medios era precisa, entonces tendría suficiente información para llevar a cabo el paso en mi primer punto anterior, y podría (probabilísticamente) asignar cada punto de datos a uno de los dos gaussianos. Aunque sabemos que nuestra suposición es incorrecta, intentemos esto de todos modos. Y luego, dadas las distribuciones asignadas a cada punto, puede obtener nuevas estimaciones para las medias usando el segundo punto. Resulta que, cada vez que recorre estos dos pasos, está mejorando un límite inferior en la probabilidad del modelo.
Eso ya es bastante bueno: a pesar de que las dos sugerencias en los puntos anteriores no parecían funcionar de manera individual, todavía puede usarlas juntas para mejorar el modelo. La verdadera magia de EM es que, después de suficientes iteraciones, el límite inferior será tan alto que no habrá espacio entre él y el máximo local. Como resultado, y ha optimizado localmente la probabilidad.
Entonces, no solo ha mejorado el modelo, ha encontrado el mejor modelo posible que se puede encontrar con actualizaciones incrementales.
Esta página de Wikipedia muestra un ejemplo un poco más complicado (gaussianos bidimensionales y covarianza desconocida), pero la idea básica es la misma. También incluye
R
código bien comentado para implementar el ejemplo.En el código, el paso "Expectativa" (E-step) corresponde a mi primer punto: averiguar qué gaussiano tiene la responsabilidad de cada punto de datos, dados los parámetros actuales para cada gaussiano. El paso "Maximización" (paso M) actualiza los medios y las covarianzas, dadas estas asignaciones, como en mi segundo punto.
Como puede ver en la animación, estas actualizaciones permiten rápidamente que el algoritmo pase de un conjunto de estimaciones terribles a un conjunto de muy buenas: realmente parece haber dos nubes de puntos centradas en las dos distribuciones gaussianas que EM encuentra.
fuente
Aquí hay un ejemplo de Maximización de Expectativas (EM) utilizado para estimar la media y la desviación estándar. El código está en Python, pero debería ser fácil de seguir, incluso si no está familiarizado con el idioma.
La motivación para EM
Los puntos rojo y azul que se muestran a continuación se extraen de dos distribuciones normales diferentes, cada una con una media particular y una desviación estándar:
Para calcular aproximaciones razonables de la media "verdadera" y los parámetros de desviación estándar para la distribución roja, podríamos mirar fácilmente los puntos rojos y registrar la posición de cada uno, y luego usar las fórmulas familiares (y de manera similar para el grupo azul) .
Ahora considere el caso en el que sabemos que hay dos grupos de puntos, pero no podemos ver qué punto pertenece a qué grupo. En otras palabras, los colores están ocultos:
No es del todo obvio cómo dividir los puntos en dos grupos. Ahora no podemos mirar las posiciones y calcular estimaciones para los parámetros de la distribución roja o la distribución azul.
Aquí es donde se puede usar EM para resolver el problema.
Usando EM para estimar parámetros
Aquí está el código utilizado para generar los puntos que se muestran arriba. Puede ver las medias reales y las desviaciones estándar de las distribuciones normales de las que se extrajeron los puntos. Las variables
red
yblue
mantienen las posiciones de cada punto en los grupos rojo y azul respectivamente:Si pudiéramos ver el color de cada punto, intentaríamos recuperar las medias y las desviaciones estándar utilizando las funciones de la biblioteca:
Pero como los colores están ocultos para nosotros, comenzaremos el proceso EM ...
Primero, simplemente adivinamos los valores para los parámetros de cada grupo ( paso 1 ). Estas conjeturas no tienen que ser buenas:
Suposiciones bastante malas: parece que los medios están muy lejos de cualquier "centro" de un grupo de puntos.
Para continuar con EM y mejorar estas conjeturas, calculamos la probabilidad de que cada punto de datos (independientemente de su color secreto) aparezca bajo estas conjeturas para la desviación media y estándar ( paso 2 ).
La variable
both_colours
contiene cada punto de datos. La funciónstats.norm
calcula la probabilidad del punto bajo una distribución normal con los parámetros dados:Esto nos dice, por ejemplo, que con nuestras conjeturas actuales, el punto de datos en 1.761 es mucho más probable que sea rojo (0.189) que azul (0.00003).
Podemos convertir estos dos valores de probabilidad en pesos ( paso 3 ) para que sumen 1 como sigue:
Con nuestras estimaciones actuales y nuestros pesos recién calculados, ahora podemos calcular nuevas estimaciones, probablemente mejores, para los parámetros ( paso 4 ). Necesitamos una función para la media y una función para la desviación estándar:
Estos se parecen mucho a las funciones habituales de la media y la desviación estándar de los datos. La diferencia es el uso de un
weight
parámetro que asigna un peso a cada punto de datos.Esta ponderación es la clave de EM. Cuanto mayor sea el peso de un color en un punto de datos, más influirá el punto de datos en las próximas estimaciones para los parámetros de ese color. En última instancia, esto tiene el efecto de tirar de cada parámetro en la dirección correcta.
Las nuevas conjeturas se calculan con estas funciones:
El proceso EM se repite con estas nuevas conjeturas desde el paso 2 en adelante. Podemos repetir los pasos para un número dado de iteraciones (digamos 20), o hasta que veamos que los parámetros convergen.
Después de cinco iteraciones, vemos que nuestras malas conjeturas iniciales comienzan a mejorar:
Después de 20 iteraciones, el proceso EM ha convergido más o menos:
A modo de comparación, aquí están los resultados del proceso EM en comparación con los valores calculados donde la información de color no está oculta:
Nota: esta respuesta fue adaptada de mi respuesta en Stack Overflow aquí .
fuente
Siguiendo la respuesta de Zhubarb, implementé el ejemplo EM de "lanzamiento de monedas" de Do y Batzoglou en GNU R. Tenga en cuenta que uso la
mle
función delstats4
paquete, esto me ayudó a comprender más claramente cómo se relacionan EM y MLE.fuente
Todo lo anterior parece grandes recursos, pero debo vincularme a este gran ejemplo. Presenta una explicación muy simple para encontrar los parámetros para dos líneas de un conjunto de puntos. El tutorial es de Yair Weiss mientras estaba en el MIT.
http://www.cs.huji.ac.il/~yweiss/emTutorial.pdf
http://www.cs.huji.ac.il/~yweiss/tutorials.html
fuente
La respuesta dada por Zhubarb es genial, pero desafortunadamente está en Python. A continuación se muestra una implementación Java del algoritmo EM ejecutado en el mismo problema (planteado en el artículo de Do y Batzoglou, 2008). He agregado algunos printf a la salida estándar para ver cómo convergen los parámetros.
El código Java sigue a continuación:
fuente
fuente
Bueno, te sugiero que leas un libro sobre R de Maria L Rizzo. Uno de los capítulos contiene el uso del algoritmo EM con un ejemplo numérico. Recuerdo haber leído el código para comprenderlo mejor.
Además, intente verlo desde un punto de vista de agrupamiento al principio. Trabaje a mano, un problema de agrupamiento en el que se toman 10 observaciones de dos densidades normales diferentes. Esto debería ayudar. Toma la ayuda de R :)
fuente
Por si acaso, escribí una implementación de Ruby del ejemplo de lanzamiento de moneda mencionado anteriormente por Do & Batzoglou y produce exactamente los mismos números que los mismos parámetros de entrada y . θ B = 0.5θA=0.6 θB=0.5
fuente