最大似然估计伪代码

时间:2011-10-10 20:05:45

标签: python statistics machine-learning pseudocode

我需要编码最大似然估计来估计某些玩具数据的均值和方差。我有一个带有100个样本的向量,使用numpy.random.randn(100)创建。数据应具有零均值和单位方差高斯分布。

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

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

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

4 个答案:

答案 0 :(得分:36)

我刚刚遇到这个,我知道它已经老了,但我希望别人能从中受益。虽然之前的评论很好地描述了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和其他模型的估算值,正如我所描述的here

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

答案 1 :(得分:18)

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

现在,您有了样本向量(我们称之为x,其元素为x[0]x[100]),您必须处理它。为此,您必须计算以下内容(f表示probability density function of the Gaussian distribution):

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

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

当你这样做时,μ是平均值的最大似然值,σ是标准差的最大似然值。

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

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

如果你真的想要计算它,你可以进行一些简化,导致下一个术语(希望我没有弄乱任何东西):

enter image description here

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

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

答案 2 :(得分:4)

您需要一个数值优化程序。不确定是否在Python中实现了任何东西,但如果是,那么它将是numpy或scipy和朋友。

查找“Nelder-Mead算法”或“BFGS”等内容。如果所有其他方法都失败了,请使用Rpy并调用R函数'optim()'。

这些功能通过搜索功能空间并尝试找出最大值的位置来工作。想象一下,试图在雾中找到山顶。您可能只是尝试总是以最陡峭的方式前进。或者您可以通过无线电和GPS装置向一些朋友发送并进行一些调查。任何一种方法都可能导致你错误的峰会,所以你经常需要从不同的点开始做几次。否则你可能会认为南峰是最高的,当时有一个巨大的北峰会使它黯然失色。

答案 3 :(得分:0)

正如约兰所说,可以通过分析计算正态分布的最大似然估计值。通过找到关于参数的对数似然函数的偏导数,将每个参数设置为零,然后同时求解两个方程,找到答案。

在正态分布的情况下,您将相对于平均值(μ)导出对数似然,然后相对于方差(sigma ^ 2)导出以得到两个等于零的等式。在求解mu和sigma ^ 2的方程后,您将得到样本均值和样本方差作为答案。

有关详细信息,请参阅wikipedia page