【问题标题】:Element-wise constraints in scipy.optimize.minimizescipy.optimize.minimize 中的元素约束
【发布时间】:2016-06-08 10:58:07
【问题描述】:

我正在使用scipy.optimize.minimize 的 COBYLA 方法来查找分类分布的参数矩阵。我需要施加约束,每个参数都大于零,并且参数矩阵的行之和是一列。

我不清楚如何在scipy.minimize 中实现这一点,因为检查了约束的非负性而不是真实性。如果我只是将数组作为约束传递,则最小化会引发异常。

有人知道如何实施这些约束吗?

【问题讨论】:

  • 我实验室的一位成员提出了一个技巧,将最后一列参数固定为一个,参数由输出的 softmax 给出。这消除了对我提到的约束的需要。不过,我认为这个问题的答案对其他人有用。
  • 这个建议不是很清楚,你能提供更多细节吗?

标签: python numpy machine-learning scipy mathematical-optimization


【解决方案1】:

第一个约束x > 0可以很简单地表达:

{'type':'ineq', 'fun': lambda x: x}

第二个约束是等式约束,COBYLA 本身并不支持。但是,您可以将其表示为两个单独的不等式约束:

{'type':'ineq', 'fun': lambda x: np.sum(x, 0) - 1}  # row sum >= 1
{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 0)}  # row sum <= 1

否则,您可以尝试使用 SLSQP,它确实支持等式约束。

【讨论】:

  • 这行得通,谢谢!我有单独的不等式约束,所以我会坚持使用 COBYLA。我发现上限/下限技巧效果很好。
  • 只约束最小的元素而不是所有元素是非常聪明的。我必须记住这一点。
  • 它很聪明,但实际上会使模型更难求解,因为它引入了不连续性。 IE。一般来说,这不是一个好主意。像瘟疫一样避免使用 min 和 max 之类的函数。
  • @ErwinKalvelagen 你是对的 - 我会删除分钟。我把它们放在那里的原因是scipy's COBYLA wrapper used to only accept scalar-valued constraint functions。我已经很久没有使用那个求解器了,我没有意识到现在支持向量值约束。
【解决方案2】:

您需要执行np.sum(x, 1) == 1 的等式约束和x &gt;= 0 的不等式约束。

但是,COBYLA 方法只能处理不等式约束,如minimize 的文档中所述(请参阅解释constraints 参数的部分)。相反,您可以使用顺序最小二乘规划 (SLSQP),它支持这两种类型的约束。 minimize 函数应根据您指定的约束自动为您选择正确的求解器。

你需要的约束可以这样实现:

def ineq_constraint(x):
    """constrain all elements of x to be >= 0"""
    return x

def eq_constraint(x):
    """constrain the sum of all rows to be equal to 1"""
    return np.sum(x, 1) - 1


constraints = [{'type': 'ineq', 'fun': ineq_constraint},
               {'type': 'eq', 'fun': eq_constraint}]

result = minimize(objective_function, x0, constraints=constraints)

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 2021-11-13
    • 2015-03-07
    • 2014-08-15
    • 2019-04-10
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多