Pseudocode D'estimation du maximum de vraisemblance

J'ai besoin de coder un estimateur de vraisemblance maximale pour estimer la moyenne et la variance de certaines données de jouets. J'ai un vecteur avec 100 échantillons, créé avec numpy.random.randn(100). Les données devraient avoir une moyenne nulle et une distribution gaussienne de variance unitaire.

J'ai vérifié Wikipedia et quelques sources supplémentaires, mais je suis un peu confus car je n'ai pas d'arrière-plan statistique.

Existe-t-il un pseudo-code pour un estimateur du maximum de vraisemblance? Je reçois L'intuition de MLE mais je ne peux pas comprendre où aller commencer à coder.

Wiki dit prendre argmax de log-vraisemblance. Ce que je comprends, c'est: j'ai besoin de calculer la log-vraisemblance en utilisant différents paramètres, puis je prendrai les paramètres qui ont donné la probabilité maximale. Ce que je ne comprends pas: où vais-je trouver les paramètres en premier lieu? Si j'essaie au hasard une moyenne et une variance différentes pour obtenir une probabilité élevée, quand devrais-je arrêter d'essayer?

23
demandé sur joran 2011-10-11 00:05:45

4 réponses

Si vous faites des calculs de maximum de vraisemblance, la première étape que vous devez prendre est la suivante: supposons une distribution qui dépend de certains paramètres. Puisque vous generate vos données (vous connaissez même vos paramètres), vous "dites" à votre programme d'assumer la distribution gaussienne. Cependant, vous ne dites pas à votre programme vos paramètres (0 et 1), mais vous les laissez inconnus a priori et les calculez ensuite.

Maintenant, vous avez votre exemple de vecteur (appelons - x, ses éléments sont x[0] pour x[100]) et vous devez le traiter. Pour ce faire, vous devez calculer ce qui suit (f désigne la fonction de densité de probabilité de la distribution gaussienne):

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

Comme vous pouvez le voir dans mon lien donné, f emploie deux paramètres (les lettres grecques µ et σ). Vous maintenant calculer les valeurs de µ et σ d'une manière telle que f(x[0]) * ... * f(x[100]) prend la valeur maximale possible.

Lorsque vous avez fait cela, µ est votre valeur de vraisemblance maximale pour la moyenne, et σ est le valeur maximale de vraisemblance pour l'écart-type.

Notez que je ne vous dis pas explicitementComment calculer les valeurs pour µ et σ, puisque c'est une procédure assez mathématique que je n'ai pas sous la main (et probablement Je ne le comprendrais pas); je vous dis juste la technique pour obtenir les valeurs, qui peut être appliquée à toutes les autres distributions.

Puisque vous voulez maximiser le terme original, vous pouvez" simplement " maximiser le logarithme du terme original - cela économise vous de traiter avec tous ces produits, et transforme le terme original en une somme avec quelques sommands.

Si vous voulez vraiment le calculer, vous pouvez faire quelques simplifications qui mènent au terme suivant (j'espère que je n'ai rien gâché):

                                  100
                                 ----
n * ln(1/(σ*sqrt(2pi))) - 0.5 *   \    (x[i]-µ)^2
                                  /    ----------
                                 ----      2σ
                                   i=0

Maintenant, vous devez trouver des valeurs pour µ et σ telles que la bête ci-dessus est maximale. Faire cela est une tâche très non triviale appelée optimisation non linéaire.

Une simplification que vous pourriez essayer est la suivante: fixer un paramètre et essayer de calculer les autres. Cela vous évite de traiter deux variables en même temps.

16
répondu phimuemue 2011-10-10 20:53:39

Je viens de tomber sur ceci, et je sais que c'est vieux, mais j'espère que quelqu'un d'autre en profite. Bien que les commentaires précédents aient donné de très bonnes descriptions de ce qu'est L'optimisation ML, personne n'a donné de pseudo-code pour l'implémenter. Python a un minimiseur dans Scipy qui va le faire. Voici un pseudo code pour une régression linéaire.

# 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

Cela fonctionne très bien pour moi. Accordé, c'est juste les bases. Il ne profile pas ou ne donne pas de CIs sur les estimations de paramètres, mais c'est un début. Vous pouvez également utilisez les techniques ML pour trouver des estimations pour, disons, ODEs et d'autres modèles, comme je le décris ici .

Je sais que cette question était ancienne, j'espère que vous l'avez compris depuis lors, mais j'espère que quelqu'un d'autre en bénéficiera.

33
répondu Nate 2013-08-21 03:32:55

Vous avez besoin d'une procédure d'optimisation numérique. Je ne sais pas si quelque chose est implémenté en Python, mais si c'est le cas, ce sera dans numpy ou scipy et friends.

Recherchez des choses comme 'l'algorithme Nelder-Mead', ou 'BFGS'. Si tout le reste échoue, utilisez Rpy et appelez la fonction R'optim ()'.

Ces fonctions fonctionnent en recherchant l'espace de fonction et en essayant de déterminer où est le maximum. Imaginez essayer de trouver le Sommet d'une colline dans le brouillard. Vous pourriez essayer de toujours monter le plus raide façon. Ou vous pourriez envoyer des amis avec des radios et des unités GPS et faire un peu d'arpentage. L'une ou l'autre méthode pourrait vous conduire à un faux sommet, vous devez donc souvent le faire plusieurs fois, à partir de différents points. Sinon, vous pouvez penser que le sommet du Sud Est le plus élevé quand il y a un sommet massif du Nord qui l'éclipse.

4
répondu Spacedman 2011-10-11 11:26:33

Comme l'a dit joran, les estimations du maximum de vraisemblance pour la distribution normale peuvent être calculées analytiquement. Les réponses sont trouvées en trouvant les dérivées partielles de la fonction log-vraisemblance par rapport aux paramètres, en mettant chacun à zéro, puis en résolvant les deux équations simultanément.

Dans le cas de la distribution normale, vous dériveriez la log-vraisemblance par rapport à la moyenne (mu), puis dériveriez par rapport à la variance (sigma^2) pour obtenir deux équations à la fois égales à zéro. Après avoir résolu les équations pour mu et sigma^2, vous obtiendrez la moyenne de l'échantillon et la variance de l'échantillon comme réponses.

Voir la page wikipedia pour plus de détails.

0
répondu justinng1 2013-07-17 17:32:04