首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含边界的Scipy.Minimize故障

包含边界的Scipy.Minimize故障
EN

Stack Overflow用户
提问于 2019-01-30 15:24:57
回答 1查看 76关注 0票数 0

我想将负对数可能性降到最小,以便尽可能接近较早的计算分布。我的分布是Beta-二项分布,我需要选择a (lpha)和b(eta)参数。我的函数基于另一个topic的一个答案来计算负逻辑概率。

代码语言:javascript
运行
复制
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中,这可以通过以下脚本来完成:

代码语言:javascript
运行
复制
# 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-脚本,如下所示:

代码语言:javascript
运行
复制
 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()缺少一个必需的位置参数:'b'

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

EN

回答 1

Stack Overflow用户

发布于 2019-01-30 15:41:30

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

代码语言:javascript
运行
复制
def func(params, args):
    ...

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

在本例中,params表示两个值,ab,因此编写如下所示的nll

代码语言:javascript
运行
复制
def nll(params):
    a, b = params
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54443957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档