【问题标题】:Trouble with Scipy.Minimize including boundsScipy.Minimize 的问题,包括边界
【发布时间】:2019-06-23 22:23:09
【问题描述】:

我想最小化负对数似然,以便尽可能接近早期计算的分布。我的分布是 Beta-Binomial 分布,我需要选择 a (lpha)b(eta) 参数。我的函数基于另一个topic 的答案之一来计算负对数似然。

def nll(a, b):
    k = players['Goals'].sum() # equal to the number of successes
    n = players['Shots'].sum() # equal to the number of trials
    log = gammaln(n + 1) + gammaln(k + a) + gammaln(n - k + b) + gammaln(a + b) - (gammaln(k + 1) + gammaln(n - k + 1) + gammaln(a) + gammaln(b) + gammaln(n + a + b))
    return -(np.exp(log))

接下来,我想最小化对数似然。在 R 中,这可以通过以下脚本完成:

# maximum likelihood estimation
m <- mle(ll, start = list(alpha = 1, beta = 10), 
method = "L-BFGS-B", lower = c(0.0001, 0.1))

ab <- coef(m) 

我正在尝试在 Python 中重现 R 脚本,如下所示:

 init_params = [1, 10] # This is equal to the start-argument in R

 res = minimize(nll, x0=init_params, method='L-BFGS-B', options={'disp' : True, 'maxiter': 250})

运行这个,会产生以下错误:

返回函数(*(wrapper_args + args)) 类型错误:nll() 缺少 1 个必需的位置参数:'b'

我到底做错了什么?我插入了 b=10 对吗?

【问题讨论】:

    标签: python r scipy


    【解决方案1】:

    optimize.minimize 期望它的第一个参数是这种形式的函数:

    def func(params, args):
        ...
    

    其中params 表示optimize.minimize 试图最小化的所有参数。 args 可用于传递不被最小化的附加参数;就optimize.minimize 而言,它们基本上是常数。

    这里params代表两个值,ab,所以nll这样写:

    def nll(params):
        a, b = params
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2014-10-19
      • 2015-12-13
      相关资源
      最近更新 更多