Scipy,使用参数依赖约束优化函数

时间:2015-07-08 09:46:18

标签: python numpy scipy mathematical-optimization

我尝试使用scipy.optimize.minimize的否定来最大化函数f (a, b, c, d)dnumpy.array个猜测变量。

我试图在每个d上设置一些界限。还有一个约束d(d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Valuea是主题函数f的另一个参数。)

我的问题是如何将此约束定义为最大化函数的参数。

我在库中找不到任何maximize函数,所以我们使用minimize的负数和minimize文档而不是here

如果问题不够明确,请考虑要求澄清。

1 个答案:

答案 0 :(得分:3)

从您的描述中,您正在优化的f的哪些参数并不完全清楚。出于本示例的目的,我将使用x来引用要优化的参数向量,并使用a来引用保持不变的相同长度的另一个参数向量。

现在让我们假设你想强制执行以下不等式约束:

10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]

首先,您必须定义一个接受xa的函数,并在满足约束时返回非负值。在这种情况下,我们可以使用:

lambda x, a: (x * a).sum() - 10

或等效地:

lambda x, a: x.dot(a) - 10

传递约束以最小化dict(或者如果你有多个约束要应用,则为一系列dicts):

con = {'type': 'ineq',
       'fun': lambda x, a: a.dot(x) - 10,
       'jac': lambda x, a: a,
       'args': (a,)}

为了提高效率,我还定义了一个返回雅可比行列式的函数(约束函数的偏导数序列与x中的每个参数),虽然这不是必需的 - 如果未指定则会估计通过一阶有限差分。

您对minimize的调用将类似于:

res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)

您可以在官方文档here中找到使用SLSQP进行约束优化的另一个完整示例。