我想最大程度地减少以下功能
def lower_bound(x, mu, r, sigma):
mu_h = mu_hat(x, mu, r)
sigma_h = sigma_hat(x, sigma)
gauss = np.polynomial.hermite.hermgauss(10)
return (1 + mu_h + math.sqrt(2) * sigma_h * min(gauss))
其中mu_hat
和sigma_hat
是某些计算的简单辅助功能。我有以下约束:
cons = ({"type": "ineq",
"fun": lambda x, mu, r: mu_hat(x, mu, r),
"args": (arg_dic,)},
{"type": "ineq",
"fun": lambda x, mu,: -sigma_hat(x, mu),
"args": (mu,)},
{"type": "ineq",
"fun": lambda x: x},
{"type": "ineq",
"fun": lambda x: 1-np.dot(np.ones(x.size), x)})
其中 arg_dic
其他参数的字典
arg_dic = {"mu": mu, "sigma": sigma, "r": r}
但是,当我尝试运行以下
时minimize(lower_bound, x0=bounds[t-1, 0],
args=(arg_dic, ),
constraints=cons)
我得到错误(在PDB中(:TypeError: <lambda>() missing 1 required positional argument: 'r'
。但是一切都定义了。如果打印词典和变量,则所有词都具有一定的值。这里出了什么问题?
在scipy.minimize()
中,args
是传递给目标函数的参数元组。在您的情况下,该功能是:
def lower_bound(x, mu, r, sigma)
您这样称呼:
arg_dic = {"mu": mu, "sigma": sigma, "r": r}
args=(arg_dic, )
问题在于您正在通过1核,该企业变成x
,没有其他参数。相反,您应该这样做:
args=(mu, sigma, r)
同样,您需要修复约束,例如:
cons = ({"type": "ineq",
"fun": lambda x, mu, r: mu_hat(x, mu, r),
"args": (mu, r)},
可以通过删除无用的lambda来简化:
cons = ({"type": "ineq",
"fun": mu_hat,
"args": (mu, r)},