Pseudocódigo de estimación de probabilidad máxima

Necesito codificar un Estimador de Probabilidad Máxima para estimar la media y la varianza de algunos datos de juguetes. Tengo un vector con 100 muestras, creado con numpy.random.randn(100) . Los datos deben tener una distribución gaussiana de media y unidad de varianza.

Revisé Wikipedia y algunas fonts adicionales, pero estoy un poco confundido ya que no tengo un historial de estadísticas.

¿Hay algún pseudo código para un estimador de máxima verosimilitud? Tengo la intuición de MLE pero no puedo averiguar dónde comenzar a codificar.

Wiki dice tomar argmax de probabilidad de registro. Lo que entiendo es: necesito calcular la probabilidad de registro utilizando diferentes parámetros y luego tomaré los parámetros que dieron la máxima probabilidad. Lo que no entiendo es: ¿dónde encontraré los parámetros en primer lugar? Si bash aleatoriamente una media y una varianza diferentes para obtener una alta probabilidad, ¿cuándo debo dejar de intentarlo?

    Si realiza los cálculos de máxima verosimilitud, el primer paso que debe seguir es el siguiente: suponga una distribución que depende de algunos parámetros. Ya que generate sus datos (incluso conoce sus parámetros), “le dice” a su progtwig que asum la distribución gaussiana. Sin embargo, no le dice a su progtwig sus parámetros (0 y 1), pero los deja a priori desconocidos y luego los calcula.

    Ahora tienes tu vector de muestra (llamémoslo x , sus elementos son x[0] a x[100] ) y debes procesarlo. Para hacerlo, debe calcular lo siguiente ( f denota la función de densidad de probabilidad de la distribución gaussiana ):

     f(x[0]) * ... * f(x[100]) 

    Como puede ver en mi enlace dado, f emplea dos parámetros (las letras griegas µ y σ). Ahora tiene que calcular los valores para µ y σ de forma tal que f(x[0]) * ... * f(x[100]) tome el valor máximo posible.

    Cuando haya hecho eso, µ es su valor de máxima verosimilitud para la media, y σ es el valor de máxima verosimilitud para la desviación estándar.

    Tenga en cuenta que no le digo explícitamente cómo calcular los valores de µ y σ, ya que este es un procedimiento bastante matemático que no tengo a mano (y probablemente no lo entendería); Solo te digo la técnica para obtener los valores, que también se puede aplicar a cualquier otra distribución.

    Ya que quiere maximizar el término original, puede “simplemente” maximizar el logaritmo del término original; esto le evita tener que lidiar con todos estos productos y transforma el término original en una sum con algunos sumndos.

    Si realmente quieres calcularlo, puedes hacer algunas simplificaciones que llevan al siguiente término (espero que no haya estropeado nada):

    introduzca la descripción de la imagen aquí

    Ahora, tienes que encontrar valores para µ y σ de modo que la bestia anterior sea máxima. Hacer eso es una tarea no trivial llamada optimización no lineal.

    Una simplificación que puede probar es la siguiente: corrija un parámetro e intente calcular el otro. Esto le evita tener que lidiar con dos variables al mismo tiempo.

    Acabo de encontrar esto, y sé que es viejo, pero espero que alguien más se beneficie de esto. Aunque los comentarios anteriores dieron descripciones bastante buenas de lo que es la optimización de ML, nadie dio pseudocódigo para implementarlo. Python tiene un minimizador en Scipy que hará esto. Aquí hay un pseudo código para una regresión lineal.

     # import the packages import numpy as np from scipy.optimize import minimize import scipy.stats as stats import time # Set up your x values x = np.linspace(0, 100, num=100) # Set up your observed y values with a known slope (2.4), intercept (5), and sd (4) yObs = 5 + 2.4*x + np.random.normal(0, 4, 100) # Define the likelihood function where params is a list of initial parameter estimates def regressLL(params): # Resave the initial parameter guesses b0 = params[0] b1 = params[1] sd = params[2] # Calculate the predicted values from the initial parameter guesses yPred = b0 + b1*x # Calculate the negative log-likelihood as the negative sum of the log of a normal # PDF where the observed values are normally distributed around the mean (yPred) # with a standard deviation of sd logLik = -np.sum( stats.norm.logpdf(yObs, loc=yPred, scale=sd) ) # Tell the function to return the NLL (this is what will be minimized) return(logLik) # Make a list of initial parameter guesses (b0, b1, sd) initParams = [1, 1, 1] # Run the minimizer results = minimize(regressLL, initParams, method='nelder-mead') # Print the results. They should be really close to your actual values print results.x 

    Esto funciona muy bien para mí. Por supuesto, esto es sólo lo básico. No perfila ni da IC en las estimaciones de los parámetros, pero es un comienzo. También puede usar técnicas de LD para encontrar estimaciones para, por ejemplo, EDO y otros modelos, como describo aquí .

    Sé que esta pregunta era vieja, espero que la hayas descubierto desde entonces, pero espero que alguien más se beneficie.

    Necesita un procedimiento de optimización numérica. No estoy seguro de si algo está implementado en Python, pero si lo está, entonces estará en entumecimiento o scipy y amigos.

    Busque cosas como ‘el algoritmo de Nelder-Mead’ o ‘BFGS’. Si todo lo demás falla, use Rpy y llame a la función R ‘optim ()’.

    Estas funciones funcionan buscando en el espacio de funciones e intentando averiguar dónde está el máximo. Imagínese tratando de encontrar la cima de una colina en la niebla. Podrías intentarlo siempre dirigiéndote de la manera más empinada. O puedes enviar a algunos amigos con radios y unidades de GPS y hacer un poco de vigilancia. Cualquiera de los dos métodos podría llevarlo a una cumbre falsa, por lo que a menudo necesita hacer esto varias veces, comenzando desde diferentes puntos. De lo contrario, puede pensar que la cumbre sur es la más alta cuando hay una cumbre norte masiva que la opaca.

    Como dijo Joran, las estimaciones de máxima verosimilitud para la distribución normal se pueden calcular analíticamente. Las respuestas se encuentran al encontrar las derivadas parciales de la función log-verosimilitud con respecto a los parámetros, estableciendo cada uno a cero y luego resolviendo ambas ecuaciones simultáneamente.

    En el caso de la distribución normal, derivaría la probabilidad logarítmica con respecto a la media (mu) y luego la derivada con respecto a la varianza (sigma ^ 2) para obtener dos ecuaciones iguales a cero. Después de resolver las ecuaciones para mu y sigma ^ 2, obtendrás la media muestral y la varianza muestral como tus respuestas.

    Vea la página de wikipedia para más detalles.