use*_*752 8 optimization scipy python-3.x
我的 MWE 如下
def obj(e, p):
S = f(e) + g(p)
return S
Run Code Online (Sandbox Code Playgroud)
我想仅最小化此函数e并将其p作为参数传递给该函数。不过,我也想依赖于约束p,并e认为是形式p + e < 1
我试过
cons = {'type': 'ineq',
'fun': lambda e, p: -e -p + 1,
'args': (p)}
Run Code Online (Sandbox Code Playgroud)
然后,对于以下情况,我尝试将其最小化 p = 0.5
minimize(obj, initial_guess, method = 'SLSQP', args = 0.5, constraints = cons)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我name 'p' is not defined在定义的行中收到错误cons。如何将参数传递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)
Run Code Online (Sandbox Code Playgroud)
use*_*752 10
好的,我认为这是我的语法错误以及应该如何传递参数的混合。对于那些可能有相同问题的人,我会在这里发布答案。
目标函数是obj(e, p)。我们只想最小化,e所以我们创建了一个其他参数的元组arguments = (0.5,)。即,设定了特定的值p=0.5。接下来定义约束函数
def prob_bound(e, p):
return -e - p + 1
Run Code Online (Sandbox Code Playgroud)
现在将约束字典写为
cons = ({'type': 'ineq',
'fun': prob_bound,
'args': arguments
})
Run Code Online (Sandbox Code Playgroud)
最后,调用最小化器
result = minimize(obj, initial_guess, method = 'SLSQP', args = arguments, constraints = cons)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3353 次 |
| 最近记录: |