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

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

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

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

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

26
задан joran 10 October 2011 в 22:57
поделиться

4 ответа

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

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

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

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

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

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

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

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

enter image description here

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

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

18
ответ дан 28 November 2019 в 06:40
поделиться

Я только что столкнулся с этим, и я знаю его старое, но я надеюсь, что кто-то еще извлекает выгоду из этого. Хотя предыдущие комментарии давали довольно хорошее описание того, что такое оптимизация 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, чтобы найти оценки, скажем, для ОДУ и других моделей, как я описываю здесь .

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

38
ответ дан 28 November 2019 в 06:40
поделиться

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

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

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

4
ответ дан 28 November 2019 в 06:40
поделиться

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

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

См. страницу википедии для более подробной информации.

1
ответ дан 28 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: