131 votos

Ejemplo numérico para entender la maximización de la expectativa

Estoy tratando de conseguir un buen agarre en el algoritmo EM, para ser capaces de implementar y utilizar. Pasé un día completo de lectura de la teoría y un papel donde EM es utilizado para el seguimiento de una aeronave utilizando la información de la posición que viene de un radar. Honestamente, no creo que comprendo plenamente la idea subyacente. Puede alguien que me señale un ejemplo numérico que muestra un par de iteraciones (3-4) de la EM de un problema más sencillo (como la estimación de los parámetros de una distribución de Gauss o de una secuencia de una sinusoidal de la serie o el ajuste de una línea).

Incluso si alguien puede que me señale una pieza de código (con datos sintéticos), puedo tratar de paso a través del código.

110voto

Zhubarb Puntos 2330

Esta es una receta para aprender EM con un enfoque práctico y (en mi opinión) muy intuitivo "de la Moneda-Toss' ejemplo:

1- Leer este breve EM tutorial de papel por Hacer y Batzoglou. Este es el esquema donde el sorteo ejemplo se explica:

enter image description here

2- Usted puede tener signos de interrogación en la cabeza, especialmente con respecto a que las probabilidades en la Expectativa de paso vienen. Por favor, eche un vistazo a las explicaciones en esta matemáticas de intercambio de la pila de la página.

3- Mirar/ejecutar este código que he escrito en Python que simula la solución a la moneda sacudida problema en la EM tutorial papel de elemento 1:

import numpy as np
import math

#### E-M Coin Toss Example as given in the EM tutorial paper by Do and Batzoglou* #### 

def get_mn_log_likelihood(obs,probs):
    """ Return the (log)likelihood of obs, given the probs"""
    # Multinomial Distribution Log PMF
    # ln (pdf)      =             multinomial coeff            *   product of probabilities
    # ln[f(x|n, p)] = [ln(n!) - (ln(x1!)+ln(x2!)+...+ln(xk!))] + [x1*ln(p1)+x2*ln(p2)+...+xk*ln(pk)]     

    multinomial_coeff_denom= 0
    prod_probs = 0
    for x in range(0,len(obs)): # loop through state counts in each observation
        multinomial_coeff_denom = multinomial_coeff_denom + math.log(math.factorial(obs[x]))
        prod_probs = prod_probs + obs[x]*math.log(probs[x])

    multinomial_coeff = math.log(math.factorial(sum(obs))) -  multinomial_coeff_denom
    likelihood = multinomial_coeff + prod_probs
    return likelihood

# 1st:  Coin B, {HTTTHHTHTH}, 5H,5T
# 2nd:  Coin A, {HHHHTHHHHH}, 9H,1T
# 3rd:  Coin A, {HTHHHHHTHH}, 8H,2T
# 4th:  Coin B, {HTHTTTHHTT}, 4H,6T
# 5th:  Coin A, {THHHTHHHTH}, 7H,3T
# so, from MLE: pA(heads) = 0.80 and pB(heads)=0.45

# represent the experiments
head_counts = np.array([5,9,8,4,7])
tail_counts = 10-head_counts
experiments = zip(head_counts,tail_counts)

# initialise the pA(heads) and pB(heads)
pA_heads = np.zeros(100); pA_heads[0] = 0.60
pB_heads = np.zeros(100); pB_heads[0] = 0.50

# E-M begins!
delta = 0.001  
j = 0 # iteration counter
improvement = float('inf')
while (improvement>delta):
    expectation_A = np.zeros((5,2), dtype=float) 
    expectation_B = np.zeros((5,2), dtype=float)
    for i in range(0,len(experiments)):
        e = experiments[i] # i'th experiment
        ll_A = get_mn_log_likelihood(e,np.array([pA_heads[j],1-pA_heads[j]])) # loglikelihood of e given coin A
        ll_B = get_mn_log_likelihood(e,np.array([pB_heads[j],1-pB_heads[j]])) # loglikelihood of e given coin B

        weightA = math.exp(ll_A) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of A proportional to likelihood of A 
        weightB = math.exp(ll_B) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of B proportional to likelihood of B                            

        expectation_A[i] = np.dot(weightA, e) 
        expectation_B[i] = np.dot(weightB, e)

    pA_heads[j+1] = sum(expectation_A)[0] / sum(sum(expectation_A)); 
    pB_heads[j+1] = sum(expectation_B)[0] / sum(sum(expectation_B)); 

    improvement = max( abs(np.array([pA_heads[j+1],pB_heads[j+1]]) - np.array([pA_heads[j],pB_heads[j]]) ))
    j = j+1

70voto

Bou Puntos 1859

Parece que tu pregunta tiene dos partes: la idea subyacente y un ejemplo concreto. Voy a empezar con la idea subyacente, un enlace a un ejemplo en la parte inferior.


EM es útil en Catch-22 de situaciones donde parece que usted necesita saber $A$ antes de poder calcular el $B$ y usted necesita saber $B$ antes de poder calcular el $A$.

El caso más común a las personas a lidiar con es, probablemente, la mezcla de distribuciones. Para nuestro ejemplo, vamos a ver un sencillo modelo de mezcla de Gaussianas:

Se tienen dos diferentes univariante de distribución Gausiana con diferentes medios y de la unidad de la varianza.

Usted tiene un montón de puntos de datos, pero no estás seguro de qué puntos de vino de la cual la distribución, y tampoco está seguro acerca de los medios de las dos distribuciones.

Y ahora usted está atascado:

  • Si usted supiera la verdad significa, usted podría averiguar los puntos de datos de vino a partir de la cual Gaussiano. Por ejemplo, si un punto de datos tenía un valor muy alto, es probable que provenía de la distribución con la media más alta. Pero usted no sabe lo que los medios están, así que esto no va a funcionar.

  • Si usted sabía que la distribución de cada punto de vino, entonces se podría estimar que las dos distribuciones de' medios a utilizar el ejemplo de los medios de los puntos relevantes. Pero en realidad no sabe que los puntos a asignar a la cual la distribución, por lo que este no funciona bien.

Así que, ni el enfoque que parece que funciona: usted necesitaría saber la respuesta antes de que usted puede encontrar la respuesta, y le pegan.

Lo que EM te permite hacer es alternar entre estos dos fáciles pasos, en lugar de abordar todo el proceso a la vez.

Usted necesita para comenzar con una estimación acerca de los dos medios (aunque su conjetura no necesariamente tiene que ser muy precisa, usted tiene que comenzar en alguna parte).

Si su conjetura acerca de los medios era la correcta, entonces usted tendría suficiente información para llevar a cabo la paso en mi primera viñeta de arriba, y usted podría (probabilísticamente) asignar a cada punto de datos para uno de los dos Gaussianas. Aunque sabemos que nuestra conjetura es malo, vamos a intentarlo de todos modos. Y entonces, dado que cada punto asignado distribuciones usted podría obtener nuevas estimaciones para los medios el uso de la segunda viñeta. Resulta que, cada vez que hacemos el bucle a través de estos dos pasos, usted está mejorando un límite inferior en el modelo de la probabilidad.

Que ya está bastante chulo: aunque los dos sugerencias en los puntos anteriores no parecía que habían de trabajar de forma individual, se pueden usar juntos para mejorar el modelo. La verdadera magia de la EM es que, después de bastante iteraciones, el límite inferior será tan alta que no habrá ningún espacio entre ella y el máximo local. Como resultado, y ha localmente optimizado de la probabilidad.

Así que no sólo mejora el modelo, usted ha encontrado el mejor modelo posible, uno puede encontrar con actualizaciones incrementales.


Esta página de la Wikipedia muestra un poco más complicado (de dos dimensiones Gaussianas y desconocido covarianza), pero la idea básica es la misma. También incluye bien-comentó R código para implementar el ejemplo.

En el código, la "Expectativa" de paso (E-step) corresponde a mi primera viñeta: averiguar que Gaussiano llega la responsabilidad de cada punto de datos, dada la actual parámetros para cada uno de Gauss. La "Maximización" de paso (M-paso) actualizaciones de los medios y covarianzas, dadas estas tareas, como en mi segunda viñeta.

Como se puede ver en la animación, estas actualizaciones rápidamente permitir que el algoritmo para pasar de un conjunto de terrible estimaciones para un conjunto de muy buenos: no realmente parecen ser dos nubes de puntos que se centra en las dos distribuciones de Gauss que EM encuentra.

11voto

user3096626 Puntos 131

Tras la respuesta de Zhubarb, implementé el y Batzoglou "sacudir de la moneda" E M ejemplo GNU R. Nota que utilizo la mle función de la stats4 paquete - esto me ayudó a comprender más claramente cómo se relacionan E-M y MLE.

require("stats4");

## sample data from Do and Batzoglou
ds<-data.frame(heads=c(5,9,8,4,7),n=c(10,10,10,10,10),
    coin=c("B","A","A","B","A"),weight_A=1:5*0)

## "baby likelihood" for a single observation
llf <- function(heads, n, theta) {
  comb <- function(n, x) { #nCr function
    return(factorial(n) / (factorial(x) * factorial(n-x)))
  }
  if (theta<0 || theta >1) { # probabilities should be in [0,1]
    return(-Inf);
  }
  z<-comb(n,heads)* theta^heads * (1-theta)^(n-heads);
  return (log(z))
}

## the "E-M" likelihood function
em <- function(theta_A,theta_B) {
  # expectation step: given current parameters, what is the likelihood
  # an observation is the result of tossing coin A (vs coin B)?
  ds$weight_A <<- by(ds, 1:nrow(ds), function(row) {
        llf_A <- llf(row$heads,row$n, theta_A);
        llf_B <- llf(row$heads,row$n, theta_B);

    return(exp(llf_A)/(exp(llf_A)+exp(llf_B)));
  })

  # maximisation step: given params and weights, calculate likelihood of the sample
  return(- sum(by(ds, 1:nrow(ds), function(row) {
    llf_A <- llf(row$heads,row$n, theta_A);
    llf_B <- llf(row$heads,row$n, theta_B);

    return(row$weight_A*llf_A + (1-row$weight_A)*llf_B);
  })))
}

est<-mle(em,start = list(theta_A=0.6,theta_B=0.5), nobs=NROW(ds))

9voto

darken Puntos 91

La mirada sobre como grandes recursos, pero debo vincular 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 en el MIT.

http://www.cs.huji.AC.il/~yweiss/emTutorial.pdf
http://www.cs.huji.AC.il/~yweiss/tutorials.html

4voto

Serhat Özgel Puntos 10010

Bueno, te sugiero ir a través de un libro sobre R por Maria L Rizzo. Uno de los capítulos contienen el uso de algoritmo EM con un ejemplo numérico. Recuerdo que pasando por el código para una mejor comprensión.

También, trate de verlo desde un punto de vista clustering al principio. Elaborar a mano, un problema de agrupamiento donde se toman 10 observaciones de dos diferentes densidades normales. Esto debería ayudar. Tomar la ayuda de R :)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X