最大似然估计伪代码

26 python statistics machine-learning pseudocode

我需要编码最大似然估计来估计一些玩具数据的均值和方差.我有一个包含100个样本的矢量numpy.random.randn(100).数据应具有零均值和单位方差高斯分布.

我检查了维基百科和一些额外的来源,但我有点困惑,因为我没有统计背景.

是否有最大似然估计的伪代码?我得到了MLE的直觉,但我无法弄清楚从哪里开始编码.

Wiki表示采用了log-likelihood的argmax.我理解的是:我需要通过使用不同的参数来计算对数似然,然后我将采用给出最大概率的参数.我没有得到的是:我在哪里可以找到参数?如果我随机尝试不同的均值和方差以获得高概率,我何时应该停止尝试?

Nat*_*ate 38

我刚刚遇到这个,我知道它已经老了,但我希望别人能从中受益.虽然之前的评论很好地描述了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
Run Code Online (Sandbox Code Playgroud)

这对我很有用.当然,这只是基础知识.它没有对参数估计进行分析或给出CI,但它是一个开始.您也可以使用ML技术来查找ODE和其他模型的估计值,如我在此处所述.

我知道这个问题已经过时了,希望你从那以后就已经知道了,但希望其他人能从中受益.


phi*_*mue 18

如果进行最大似然计算,则需要采取的第一步是:假设分布取决于某些参数.由于你generate的数据(你甚至知道你的参数),你"告诉"你的程序假设高斯分布.但是,您没有告诉您的程序您的参数(0和1),但是您先验地保留它们并在之后计算它们.

现在,你有你的样品载体(姑且称之为x,它的元素x[0]x[100]),你必须处理它.为此,您必须计算以下内容(f表示高斯分布概率密度函数):

f(x[0]) * ... * f(x[100])
Run Code Online (Sandbox Code Playgroud)

正如您在我给定的链接中所看到的,f使用两个参数(希腊字母μ和σ).现在必须以一种f(x[0]) * ... * f(x[100])最大可能值的方式计算μ和σ的值.

完成后,μ是平均值的最大似然值,σ是标准差的最大似然值.

请注意,我没有明确地告诉你如何计算μ和σ的值,因为这是一个非常数学的程序,我手边没有(可能我不理解); 我只是告诉你获取值的技术,它也可以应用于任何其他发行版.

由于您希望最大化原始术语,因此您可以"简单地"最大化原始术语的对数 - 这使您无需处理所有这些产品,并将原始术语转换为带有某些加数的总和.

如果你真的想要计算它,你可以做一些简化,导致下面的术语(希望我没有搞砸任何东西):

在此输入图像描述

现在,你必须找到μ和σ的值,使得上面的野兽是最大的.这样做是一项非常重要的任务,称为非线性优化.

您可以尝试的一种简化如下:修复一个参数并尝试计算另一个参数.这样可以避免同时处理两个变量.

  • @Kyle FYI高斯的MLEs都可以通过分析得到.它们是样本均值和样本方差,尽管后者对于小样本大小略有偏差,因此通常除以n-1而不是n.更一般地说,你将要学习牛顿方法和EM(期望最大化). (2认同)