Подтвердить что ты не робот

Псевдокод оценки максимального правдоподобия

Мне нужно закодировать Оценщик максимального правдоподобия, чтобы оценить среднее и дисперсию некоторых данных игрушек. У меня есть вектор с 100 образцами, созданный с помощью numpy.random.randn(100). Данные должны иметь нулевое среднее и разброс по гауссовскому распределению.

Я проверил Википедию и некоторые дополнительные источники, но я немного смущен, так как у меня нет фона статистики.

Есть ли псевдокод для оценки максимального правдоподобия? Я получаю интуицию MLE, но я не могу понять, с чего начать кодирование.

Wiki говорит, что принимает argmax log-правдоподобия. Я понимаю: мне нужно вычислить лог-правдоподобие с помощью разных параметров, а затем я возьму параметры, которые дали максимальную вероятность. То, чего я не получаю: где я найду параметры в первую очередь? Если я случайным образом попробую различное среднее и дисперсию, чтобы получить высокую вероятность, когда я должен перестать пытаться?

4b9b3361

Ответ 1

Если вы делаете расчеты максимального значения, первым шагом, который вам нужно предпринять, является следующее: Предположим, что распределение зависит от некоторых параметров. Поскольку вы generate ваши данные (вы даже знаете свои параметры), вы "рассказываете" своей программе о принятии гауссовского распределения. Однако вы не указываете своей программе свои параметры (0 и 1), но вы оставляете их неизвестными априорно и вычисляете их впоследствии.

Теперь у вас есть вектор-образец (пусть его называют x, его элементы x[0] - x[100]), и вам нужно его обработать. Для этого вам необходимо вычислить следующее (fобозначает функцию плотности вероятности распределения Гаусса):

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

Как вы можете видеть в моей ссылке, f использует два параметра (греческие буквы μ и σ). Теперь вам нужно вычислить значения для μ и σ таким образом, чтобы f(x[0]) * ... * f(x[100]) принимало максимально возможное значение.

Когда вы это сделали, μ - ваше значение максимального правдоподобия для среднего значения, а σ - максимальное значение правдоподобия для стандартного отклонения.

Обратите внимание, что я явно не рассказываю вам, как вычислить значения для μ и σ, так как это довольно математическая процедура, которой у меня нет (и, вероятно, я ее не понимаю); Я просто передаю вам технику получения значений, которые могут быть применены и к любым другим дистрибутивам.

Поскольку вы хотите максимизировать исходный термин, вы можете "просто" максимизировать логарифм исходного термина - это избавляет вас от работы со всеми этими продуктами и преобразует исходный термин в сумму с некоторыми слагаемыми.

Если вы действительно хотите вычислить его, вы можете сделать некоторые упрощения, которые приведут к следующему термину (надеюсь, что я ничего не испортил):

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

Теперь вам нужно найти значения для μ и σ так, чтобы вышеприведенный зверь был максимальным. Это очень нетривиальная задача, называемая нелинейной оптимизацией.

Одно упрощение, которое вы могли бы попробовать, следующее: исправить один параметр и попытаться вычислить другое. Это избавит вас от одновременного использования двух переменных.

Ответ 2

Я только наткнулся на это, и я знаю его старый, но я надеюсь, что кто-то еще выиграет от этого. Хотя в предыдущих комментариях давались довольно хорошие описания того, что такое оптимизация ML, никто не дал псевдокод для ее реализации. У Python есть минимизатор в Scipy, который сделает это. Здесь псевдокод для линейной регрессии.

# 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

Это отлично работает для меня. Конечно, это всего лишь основы. Он не профилирует или не дает CI для оценки параметров, но его начало. Вы также можете использовать методы ML для поиска оценок, например, для ODE и других моделей, поскольку я описываю здесь.

Я знаю, что этот вопрос был старым, надеюсь, вы поняли это с тех пор, но, надеюсь, кто-то еще выиграет.

Ответ 3

Вам нужна процедура численной оптимизации. Не уверен, что в Python реализовано что-либо, но если это будет, то оно будет в numpy или scipy и друзьях.

Ищите такие вещи, как "Алгоритм Нельдера-Мида" или "BFGS". Если все остальное не удается, используйте Rpy и вызовите функцию R optim().

Эти функции работают путем поиска в функциональном пространстве и пытаются определить, где находится максимум. Представьте, что вы пытаетесь найти вершину холма в тумане. Вы можете просто попытаться всегда возглавить самый крутой путь. Или вы можете отправить некоторых друзей с помощью радиостанций и GPS-устройств и немного осмотреть. Любой из методов может привести вас к ложной вершине, поэтому вам часто нужно делать это несколько раз, начиная с разных точек. В противном случае вы можете подумать, что южная вершина самая высокая, когда массивная северная вершина затмевает ее.

Ответ 4

Как сказал Йоран, оценки максимального правдоподобия для нормального распределения можно вычислить аналитически. Ответы найдены путем нахождения частных производных функции логарифмического правдоподобия по параметрам, каждый из которых устанавливает нуль, а затем одновременно решает оба уравнения.

В случае нормального распределения вы получите логарифмическую правдоподобие относительно среднего (mu), а затем выводите по отношению к дисперсии (sigma ^ 2), чтобы получить два уравнения, равные нулю. После решения уравнений для mu и sigma ^ 2 вы получите тестовое среднее и выборочную дисперсию в качестве своих ответов.

Подробнее см. страницу wikipedia.