library - python machine learning by example pdf
Estimación de máxima verosimilitud pseudocódigo (4)
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 fuentes 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 usando 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 intento aleatoriamente una media y una varianza diferentes para obtener una alta probabilidad, ¿cuándo debo dejar de intentarlo?
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 CI 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 here .
Sé que esta pregunta era vieja, espero que la hayas descubierto desde entonces, pero espero que alguien más se beneficie.
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 derivaría 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.
Necesita un procedimiento de optimización numérica. No estoy seguro si algo está implementado en Python, pero si lo está, entonces estará en números y amigos 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 al buscar el espacio de funciones y tratar de averiguar dónde está el máximo. Imagínate tratando de encontrar la cima de una colina en la niebla. Podrías intentar 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 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.
Si realiza los cálculos de máxima verosimilitud, el primer paso que debe realizar 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 programa que asuma la distribución gaussiana. Sin embargo, no le dice a su programa 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 tal manera 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 desea 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 suma con algunos sumandos.
Si realmente quieres calcularlo, puedes hacer algunas simplificaciones que llevan al siguiente término (espero que no haya estropeado nada):
Ahora, tienes que encontrar valores para µ y σ de tal manera 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.