Maksymalne prawdopodobieństwo oszacowania pseudokodu

Muszę zakodować Estymator maksymalnego prawdopodobieństwa, aby oszacować średnią i wariancję niektórych danych zabawek. Mam wektor ze 100 próbkami, utworzony za pomocą numpy.random.randn(100). Dane powinny mieć zerową średnią i jednostkową wariancję rozkładu Gaussa.

Sprawdziłem Wikipedię i kilka dodatkowych źródeł, ale jestem trochę zdezorientowany, ponieważ nie mam zaplecza statystycznego.

Czy istnieje jakiś pseudo kod dla estymatora maksymalnego prawdopodobieństwa? Mam intuicję MLE ale nie wiem gdzie zacznij kodować.

Wiki mówi, biorąc argmax log-prawdopodobieństwo. Rozumiem to: muszę obliczyć prawdopodobieństwo log używając różnych parametrów, a następnie wezmę parametry, które dały maksymalne prawdopodobieństwo. Czego nie rozumiem to: gdzie znajdę parametry w pierwszej kolejności? Jeśli losowo wypróbuję inną średnią i wariancję, aby uzyskać wysokie prawdopodobieństwo, kiedy powinienem przestać próbować?

Author: joran, 2011-10-11

4 answers

Jeśli wykonasz obliczenia maksymalnego prawdopodobieństwa, pierwszym krokiem, który musisz wykonać, jest: Przyjmij rozkład, który zależy od niektórych parametrów. Ponieważ posiadasz generate swoje dane (znasz nawet swoje parametry)," mówisz " swojemu programowi, aby przyjął rozkład Gaussa. Jednak nie podajesz programowi swoich parametrów (0 i 1), ale zostawiasz je nieznane a priori i obliczasz je później.

Teraz masz swój wektor próbki (nazwijmy go x, jego elementy są x[0] do x[100]) i trzeba to przetworzyć. Aby to zrobić, musisz obliczyć następujące (f oznacza funkcję gęstości prawdopodobieństwa rozkładu Gaussa):

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

Jak widać w podanym przeze mnie linku, f wykorzystuje dwa parametry (greckie litery µ i σ). musisz teraz obliczyć wartości dla µ i σ w taki sposób, że f(x[0]) * ... * f(x[100]) przyjmuje maksymalną możliwą wartość.

Kiedy to zrobisz, µ jest maksymalną wartością prawdopodobieństwa dla średniej, a σ jest maksymalna wartość prawdopodobieństwa dla odchylenia standardowego.

Zauważ, że nie mówię ci wprost Jak obliczyć wartości dla µ i σ, ponieważ jest to dość matematyczna procedura, której nie mam pod ręką (i prawdopodobnie bym jej nie zrozumiał); po prostu mówię Ci, jak uzyskać wartości, które mogą być stosowane do innych rozkładów, jak również.

Ponieważ chcesz zmaksymalizować pierwotny termin, możesz" po prostu " zmaksymalizować logarytm pierwotnego terminu - To oszczędza ty od czynienia z tymi wszystkimi produktami, i przekształca pierwotny termin w sumę z niektórych summands.

Jeśli naprawdę chcesz to obliczyć, możesz zrobić kilka uproszczeń, które prowadzą do następującego terminu (mam nadzieję, że nic nie zepsułem): {]}

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

Teraz musisz znaleźć wartości dla µ i σ takie, że powyższa bestia jest maksymalna. Jest to bardzo nietrywialne zadanie zwane optymalizacją nieliniową.

Jedno uproszczenie, które możesz wypróbować, jest następujące: Fix one parameter i spróbuj obliczyć inne. Pozwala to zaoszczędzić od radzenia sobie z dwiema zmiennymi w tym samym czasie.

 16
Author: phimuemue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-10 20:53:39

Natknąłem się na to i Wiem, że jest stare, ale mam nadzieję, że ktoś inny na tym skorzysta. Chociaż poprzednie komentarze dawały całkiem dobre opisy tego, czym jest optymalizacja ML, nikt nie podał pseudo-kodu, aby go zaimplementować. Python ma minimizer w Scipy, który to zrobi. Oto pseudo kod regresji liniowej.

# 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
To mi pasuje. To tylko podstawy. Nie profiluje ani nie podaje CIs na szacunkach parametrów, ale jego początek. Można również użyj technik ML, aby znaleźć szacunki dla, powiedzmy, ODEs i innych modeli, jak opisuję tutaj .

Wiem, że to pytanie było stare, mam nadzieję, że rozgryzłeś to od tego czasu, ale mam nadzieję, że ktoś inny skorzysta.

 33
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 03:32:55

Potrzebujesz numerycznej procedury optymalizacji. Nie wiem, czy cokolwiek jest zaimplementowane w Pythonie, ale jeśli tak, to będzie to w numpy lub scipy and friends.

Szukaj rzeczy takich jak 'algorytm Nelder-Mead', lub 'BFGS'. Jeśli Wszystko inne zawiedzie, użyj Rpy i wywołaj funkcję r'optim ()'.

Funkcje te działają poprzez przeszukiwanie przestrzeni funkcji i próby ustalenia, gdzie jest maksimum. Wyobraź sobie, że próbujesz znaleźć szczyt wzgórza we mgle. Możesz po prostu spróbować zawsze zmierzać w górę najbardziej stromych sposób. Albo możesz wysłać przyjaciół z radiostacjami i GPS-ami i zrobić trochę pomiarów. Każda z metod może doprowadzić cię do fałszywego szczytu, więc często musisz to zrobić kilka razy, zaczynając od różnych punktów. W przeciwnym razie można pomyśleć, że Południowy szczyt jest najwyższy, gdy jest ogromny północny szczyt przysłaniający go.

 4
Author: Spacedman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 11:26:33

Jak powiedział joran, maksymalne szacunki prawdopodobieństwa dla rozkładu normalnego można obliczyć analitycznie. Odpowiedzi można znaleźć, znajdując częściowe pochodne funkcji log-prawdopodobieństwa w odniesieniu do parametrów, ustawiając każdy na zero, a następnie rozwiązując oba równania jednocześnie.

W przypadku rozkładu normalnego można wyprowadzać log-Prawdopodobieństwo w odniesieniu do średniej (mu), a następnie wyprowadzać w odniesieniu do wariancji (sigma^2), aby uzyskać dwa równania równe zero. Po rozwiązaniu równań dla mu i sigma^2, otrzymasz przykładową średnią i wariancję próbki jako odpowiedzi.

Zobacz stronę wikipedia Po Więcej Szczegółów.

 0
Author: justinng1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-17 17:32:04