我想使用scipy.minimize
最小化以下功能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[1]))
测试所有涉及的函数并按预期返回值。现在,为了设置最小化过程,我定义了
cons = ({"type": "ineq",
"fun": mu_hat,
"args": (mu, r)},
{"type": "ineq",
"fun": lambda x, sigma: -1.0*sigma_hat(x, sigma),
"args": (sigma)},
{"type": "ineq",
"fun": lambda x: x},
{"type": "ineq",
"fun": lambda x: 1-np.dot(np.ones(x.size), x)})
作为约束。当我运行此代码时scipy.minimize给出了以下关于约束的错误消息:
File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/slsqp.py", line 312, in <listcomp>
mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['ineq']]))
TypeError: <lambda>() argument after * must be an iterable, not float
定义的约束不正确?
答案 0 :(得分:1)
错误消息显示:
mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['ineq']]))
TypeError: <lambda>() argument after * must be an iterable, not float
因此,我们可以推断c['args']
的类型为float
,因为c['args']
是应用*
的唯一变量。很明显,'args'
中c
的查找已成功,因此我们知道c
是float
,其中包含可迭代(列表,元组等)。
如果我们现在查看您的约束条件,则args
在一个案例中为(mu, r)
,在另一个案例中为(sigma)
。问题很明显:(sigma)
相当于sigma
,而不是元组。要在Python中创建1元组,您必须说(sigma,)
。