我需要编码最大似然估计来估计某些玩具数据的均值和方差。我有一个带有100个样本的向量,使用numpy.random.randn(100)
创建。数据应具有零均值和单位方差高斯分布。
我检查了维基百科和一些额外的来源,但由于我没有统计背景,我有点困惑。
最大似然估计器是否有伪代码?我得到了MLE的直觉,但我无法弄清楚从哪里开始编码。
Wiki表示采用log-likelihood的argmax。我理解的是:我需要通过使用不同的参数来计算对数似然,然后我将采用给出最大概率的参数。我没有得到的是:我在哪里可以找到参数?如果我随机尝试不同的意思和方差得到很高的概率,什么时候应该停止尝试?
答案 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])
取最大可能值的方式计算μ和σ的值。
当你这样做时,μ是平均值的最大似然值,σ是标准差的最大似然值。
请注意,我没有明确地告诉你如何计算μ和σ的值,因为这是一个非常数学的程序,我手头没有(可能我不明白它);我只是告诉你获取值的技术,它也可以应用于任何其他发行版。
由于您希望最大化原始术语,您可以“简单地”最大化原始术语的对数 - 这可以使您免于处理所有这些产品,并将原始术语转换为带有某些加数的总和。
如果你真的想要计算它,你可以进行一些简化,导致下一个术语(希望我没有弄乱任何东西):
现在,你必须找到μ和σ的值,以便上面的野兽是最大的。这样做是一项非常重要的任务,称为非线性优化。
您可以尝试的一种简化如下:修复一个参数并尝试计算另一个参数。这样可以避免同时处理两个变量。
答案 2 :(得分:4)
您需要一个数值优化程序。不确定是否在Python中实现了任何东西,但如果是,那么它将是numpy或scipy和朋友。
查找“Nelder-Mead算法”或“BFGS”等内容。如果所有其他方法都失败了,请使用Rpy并调用R函数'optim()'。
这些功能通过搜索功能空间并尝试找出最大值的位置来工作。想象一下,试图在雾中找到山顶。您可能只是尝试总是以最陡峭的方式前进。或者您可以通过无线电和GPS装置向一些朋友发送并进行一些调查。任何一种方法都可能导致你错误的峰会,所以你经常需要从不同的点开始做几次。否则你可能会认为南峰是最高的,当时有一个巨大的北峰会使它黯然失色。
答案 3 :(得分:0)
正如约兰所说,可以通过分析计算正态分布的最大似然估计值。通过找到关于参数的对数似然函数的偏导数,将每个参数设置为零,然后同时求解两个方程,找到答案。
在正态分布的情况下,您将相对于平均值(μ)导出对数似然,然后相对于方差(sigma ^ 2)导出以得到两个等于零的等式。在求解mu和sigma ^ 2的方程后,您将得到样本均值和样本方差作为答案。
有关详细信息,请参阅wikipedia page。