Scipy,使用参数相关约束优化函数
Scipy, optimize a function with argument dependent constraints
我正在尝试使用 scipy.optimize.minimize
的负数来最大化函数 f (a, b, c, d)
。 d
是 numpy.array
个猜测变量。
我试图对每个 d
设置一些界限。还有对每个 d
的约束,使得 (d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Value
(a
是主题函数 f
的另一个参数)。
我的问题是如何将此约束定义为最大化函数的参数。
我在库中找不到任何 maximize
函数,所以我们使用 minimize
的负数和 minimize
文档而不是 here.
如果问题不够清楚,请考虑要求澄清。
从您的描述中不能完全清楚您正在优化 f
的哪些参数。出于本示例的目的,我将使用 x
来引用您正在优化的参数向量,并使用 a
来引用另一个长度相同且保持不变的参数向量。
现在假设您想强制执行以下不等式约束:
10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]
首先,您必须定义一个函数,该函数接受 x
和 a
以及 returns 满足约束条件时为非负值。在这种情况下,我们可以使用:
lambda x, a: (x * a).sum() - 10
或等同于:
lambda x, a: x.dot(a) - 10
约束被传递以最小化一个字典(或者一个字典序列,如果你有多个约束要应用):
con = {'type': 'ineq',
'fun': lambda x, a: a.dot(x) - 10,
'jac': lambda x, a: a,
'args': (a,)}
为了提高效率,我还定义了一个 returns 雅可比行列式的函数(约束函数 w.r.t 的偏导数序列。x
中的每个参数),尽管这不是必需的 - 如果未指定,将通过一阶有限差分进行估计。
您对 minimize
的调用将类似于:
res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)
您可以在官方文档中找到另一个使用 SLSQP 进行约束优化的完整示例 here。
我正在尝试使用 scipy.optimize.minimize
的负数来最大化函数 f (a, b, c, d)
。 d
是 numpy.array
个猜测变量。
我试图对每个 d
设置一些界限。还有对每个 d
的约束,使得 (d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Value
(a
是主题函数 f
的另一个参数)。
我的问题是如何将此约束定义为最大化函数的参数。
我在库中找不到任何 maximize
函数,所以我们使用 minimize
的负数和 minimize
文档而不是 here.
如果问题不够清楚,请考虑要求澄清。
从您的描述中不能完全清楚您正在优化 f
的哪些参数。出于本示例的目的,我将使用 x
来引用您正在优化的参数向量,并使用 a
来引用另一个长度相同且保持不变的参数向量。
现在假设您想强制执行以下不等式约束:
10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]
首先,您必须定义一个函数,该函数接受 x
和 a
以及 returns 满足约束条件时为非负值。在这种情况下,我们可以使用:
lambda x, a: (x * a).sum() - 10
或等同于:
lambda x, a: x.dot(a) - 10
约束被传递以最小化一个字典(或者一个字典序列,如果你有多个约束要应用):
con = {'type': 'ineq',
'fun': lambda x, a: a.dot(x) - 10,
'jac': lambda x, a: a,
'args': (a,)}
为了提高效率,我还定义了一个 returns 雅可比行列式的函数(约束函数 w.r.t 的偏导数序列。x
中的每个参数),尽管这不是必需的 - 如果未指定,将通过一阶有限差分进行估计。
您对 minimize
的调用将类似于:
res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)
您可以在官方文档中找到另一个使用 SLSQP 进行约束优化的完整示例 here。