Scipy minimize:如何将参数传递给目标函数和约束条件

13

这是我的最小可行化产品(MWE)

def obj(e, p):
    S = f(e) + g(p)
    return S

我希望仅在e上最小化此函数,并将p作为参数传递给函数。然而,我还想要一个依赖于pe的约束条件,其形式为p+e<1

我尝试过

cons = {'type': 'ineq',
       'fun': lambda e, p: -e -p + 1,
       'args': (p)}

然后,我尝试在p = 0.5的情况下将其最小化。

minimize(obj, initial_guess, method = 'SLSQP', args = 0.5, constraints = cons)

但这不起作用。我在定义cons的那一行中得到错误name 'p' is not defined。我如何将参数p传递给目标函数和约束条件?


完整代码如下

from scipy.optimize import minimize
from scipy.stats import entropy
import numpy as np

#Create a probability vector
def p_vector(x):
    v = np.array([x, 1-x])
    return v


#Write the objective function 
def obj(e, p):
    S = -1*entropy(p_vector(p + e), base = 2) 
    return S

##Constraints
cons = {'type': 'ineq',
       'fun': lambda e: -p - e + 1,
       'args': (p,)
       }

initial_guess = 0

result = minimize(obj, initial_guess, method = 'SLSQP', args = (0.5, ), constraints = cons)
print(result)

要将args作为元组传递,请使用(p,)(0.5,)。在某些情况下,它可能会自动将标量转换为元组,但为了安全起见,我建议手动进行转换。 - hpaulj
我尝试在定义cons时使用'args':(p,),但仍然出现错误,指出该行中未定义名称“p”。另外,如果不清楚,p = 0.5是我正在尝试运行的情况。 - user1936752
args=(0.5,)p 设置为在调用 obj 时使用的参数。但是,查看 minimize 的文档,似乎 cons 中的 args 定义了传递给 lambda 的内容。因此,我会尝试 'args': (0.5,)。我很少使用 cons,所以完全是根据文档而非经验来进行操作。 - hpaulj
哦,现在它给我一个新的错误 "<lambda>() takes 1 positional argument but 2 were given"。为了更清晰明了,我已经将我的完整代码附在了问题中。 - user1936752
1个回答

18

好的,我发现这是我的语法错误和参数传递方式混合在一起了。为了那些可能有同样问题的人,我会在这里发布一个答案。

目标函数是obj(e, p)。我们只想最小化e,因此我们创建一个其他参数的元组arguments = (0.5,)。也就是说,设置一个特定的值p=0.5。接下来定义约束函数。

def prob_bound(e, p):
    return -e - p + 1

现在,我们要编写约束字典:

cons = ({'type': 'ineq',
       'fun': prob_bound,
       'args': arguments       
       })

最后,一个人调用了最小化器

result = minimize(obj, initial_guess, method = 'SLSQP', args = arguments, constraints = cons)

嗨@user1936752,我有一个问题,它的约束条件与您的约束条件非常相似。我正在尝试在此处https://stackoverflow.com/q/72835244/2379433中解释的问题中使用scipy编写约束条件。您知道我该如何实现我的约束吗? - Shahrooz Pooryousef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接