最大似然估计伪cod

2024-05-15 12:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我查了维基百科和一些额外的资料,但我有点困惑,因为我没有统计背景。

极大似然估计有伪码吗?我有MLE的直觉,但我不知道从哪里开始编码。

维基百科说,把日志的可能性设为argmax。我的理解是:我需要通过使用不同的参数来计算对数似然,然后取给出最大概率的参数。我不明白的是:我在哪里能找到参数呢?如果我随机尝试不同的均值和方差以获得较高的概率,我应该何时停止尝试?


Tags: 数据numpy编码参数单位random概率向量
3条回答

如果进行最大似然计算,则需要采取的第一步是:假设一个依赖于某些参数的分布。因为你的数据(你甚至知道你的参数),你“告诉”你的程序假设高斯分布。但是,你不告诉你的程序你的参数(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

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

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

我刚遇到这个,我知道它很古老,但我希望其他人能从中受益。尽管前面的注释对什么是ML优化给出了很好的描述,但是没有人给出伪代码来实现它。Python在Scipy中有一个minimizer可以做到这一点。这是线性回归的伪代码。

# 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

这对我很有用。当然,这只是基础。它不分析或给出参数估计的CIs,但它是一个开始。您还可以使用ML技术来查找对ODEs和其他模型的估计,如我所描述的here

我知道这个问题很老了,希望你从那时起就解决了,但希望其他人能从中受益。

你需要一个数值优化程序。不确定是否有东西是用Python实现的,但如果是,那么它将在numpy或scipy和friends中实现。

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

这些函数通过搜索函数空间并试图找出最大值的位置来工作。想象一下在雾中寻找山顶的情景。你可以试着一直走最陡的路。或者你可以派一些朋友去用无线电和全球定位系统做一些测量。任何一种方法都可能导致一个错误的顶点,所以你经常需要从不同的角度出发,这样做几次。否则,你可能会认为南方峰会是最高的,因为有一个巨大的北方峰会使它黯然失色。

相关问题 更多 >