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

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

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

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

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


person Community    schedule 10.10.2011    source источник
comment
Если у вас есть данные, то среднее значение = данные, дисперсия = 0,0.   -  person John Machin    schedule 11.10.2011
comment
извините за путаницу, данные представляют собой вектор со 100 выборками.   -  person    schedule 11.10.2011


Ответы (4)


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

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

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

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

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

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

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

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

введите здесь описание изображения

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

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

person phimuemue    schedule 10.10.2011
comment
Спасибо за Ваш ответ. Что я понимаю: если я сохраню один параметр фиксированным и вычислю другой, и наоборот, я действительно буду использовать алгоритм максимизации ожидания, верно? en.wikipedia.org/wiki/ - person ; 11.10.2011
comment
Я думаю, что это могло быть так (но я не уверен в этом). Я думаю, что начало со среднего (среднего значения) в качестве отправной точки для µ (привязка µ к среднему), а затем максимизация σ может быть хорошим началом ... - person phimuemue; 11.10.2011
comment
@Kyle: возможно, en.wikipedia.org/wiki/ представляет интерес для ты... - person phimuemue; 11.10.2011
comment
@Kyle FYI Обе MLE для гауссианы можно получить аналитически. Это среднее значение выборки и дисперсия выборки, хотя последнее немного смещено для небольших размеров выборки, поэтому часто делят на n-1, а не на n. В более общем плане вы захотите изучить метод Ньютона и, возможно, EM (максимальное ожидание). - person joran; 11.10.2011
comment
@joran Итак, для гауссовского распределения, если я возьму выборочное среднее и выборочную дисперсию, я получу MLE набора данных. Фактически, мне нужно применить предвзятую и беспристрастную оценку MLE для набора данных. Итак, в этом случае знаете ли вы, работает ли просто выборочное среднее и выборочная дисперсия? - person ; 11.10.2011
comment
Математический код в латексе стал более читаемым с использованием латекса. Код, если кому-то нужно / для изменений: n \ cdot ln (\ frac {1} {\ sigma \ sqrt {2 \ pi}}) - 0.5 \ sum ^ {100} _ {i = 0} {\ frac {( x [i] - \ mu) ^ 2} {2 \ sigma}} Используйте это для преобразования: codecogs. ru / latex / eqneditor.php - person ntg; 08.11.2018

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

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

person Nate    schedule 21.08.2013
comment
разве не наклон и y-int (1.0101010101010102, 1.0) соответственно? - person O.rka; 30.09.2015
comment
Ссылка, которую вы разместили здесь, была удалена. - person muammar; 16.04.2018

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

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

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

person Spacedman    schedule 11.10.2011
comment
Если функция плотности вероятности имеет решение в закрытой форме, вам не нужно использовать числовую оптимизацию. Например, параметры многовариантной дисперсии могут быть оценены с помощью производной по величине. mu и sigma и приравняем его к 0. Оптимальные параметры соответствуют mu и sigma данных. - person yasin.yazici; 28.10.2017

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

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

Дополнительные сведения см. На странице википедии.

person justinng1    schedule 17.07.2013