Scipy出现问题。最小化边界

时间:2019-01-30 15:24:57

标签: python r scipy

我想最小化对数可能性,以尽可能接近早期计算出的分布。我的分布是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)) TypeError:nll()缺少1个必需的位置参数:'b'

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

1 个答案:

答案 0 :(得分:0)

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

def func(params, args):
    ...

其中params代表optimize.minimize试图最小化的所有参数。 args可用于传递其他参数,这些参数不会被最小化。就optimize.minimize而言,它们本质上是常量。

在这种情况下,params代表两个值,ab,所以像这样写nll

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