最大似然估计伪码
machine-learning
python
5
0

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

我检查了维基百科和一些其他资源,但是由于没有统计背景,我有点困惑。

最大似然估计器是否有任何伪代码?我得到了MLE的直觉,但是我不知道从哪里开始编码。

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

如果进行最大似然计算,则需要执行的第一步如下:假设依赖于某些参数的分布。由于generate了数据(甚至知道了参数),因此可以“告诉”程序以采用高斯分布。但是,您不会告诉程序您的参数(0和1),而是先验地让它们未知,然后再进行计算。

现在,您有了样本向量(我们将其称为x ,其元素是x[0]x[100] ),然后必须对其进行处理。为此,您必须计算以下内容( f表示高斯分布概率密度函数 ):

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

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

完成此操作后,µ是平均值的最大似然值,而σ是标准偏差的最大似然值。

注意,我没有明确地告诉您如何计算µ和σ的值,因为这是我手头上没有的数学过程(可能我不会理解)。我只是告诉您获取值的技术,该技术也可以应用于任何其他发行版。

由于要最大化原始项的对数,因此可以“简单地”最大化原始项的对数-这样可以避免处理所有这些乘积,并将原始项转换为具有某些求和数的和。

如果您真的想计算它,可以做一些简化,得出以下术语(希望我什么都没弄乱):

在此处输入图片说明

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

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

收藏
评论

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

寻找诸如“ Nelder-Mead算法”或“ BFGS”之类的东西。如果所有其他方法均失败,请使用Rpy并调用R函数'optim()'。

这些函数通过搜索函数空间并尝试找出最大值在哪里而起作用。想象一下试图在雾中找到一座小山的顶部。您可以尝试始终以最陡峭的方式前进。或者,您可以通过收音机和GPS装置派遣一些朋友,并进行一些测量。每种方法都可能导致您虚假的登顶,因此您通常需要从不同的角度出发多次执行此操作。否则,当有一个巨大的北峰掩盖它时,您可能会认为南峰是最高的。

收藏
评论

我刚刚遇到了这个问题,我知道它的悠久历史,但是我希望其他人可以从中受益。尽管前面的评论对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和其他模型的估算值,如我在此处所述。

我知道这个问题很旧,希望您从那时起就已经解决了,但希望其他人也会受益。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号