在python 3.4中如何将多个参数移交给约束函数进行最小化

时间:2017-06-23 10:08:03

标签: python scipy

我想尽量减少以下功能

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_hatsigma_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'。但一切都是定义的。如果打印字典和变量都具有一定的值。这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

scipy.minimize() args中,def lower_bound(x, mu, r, sigma) 是一个传递给目标函数的参数元组。在您的情况下,该功能是:

arg_dic = {"mu": mu, "sigma": sigma, "r": r}
args=(arg_dic, )

你这样称呼它:

x

问题是你传递的是一个1元组,它变为args=(mu, sigma, r) ,而没有其他参数。相反,你应该这样做:

cons = ({"type": "ineq",
         "fun": lambda x, mu, r: mu_hat(x, mu, r),
         "args": (mu, r)},

同样,您需要修复约束,例如:

cons = ({"type": "ineq",
         "fun": mu_hat,
         "args": (mu, r)},

通过删除无用的lambda可以简化:

sorted