python - Scipy.optimize COBYLA 约束违规

标签 python optimization scipy constraints

我有一个带有约束的优化问题,但 COBYLA 求解器似乎不遵守我指定的约束。

我的优化问题:

cons = ({'type':'ineq', 'fun':lambda t: t},) # all variables must be positive
minimize(lambda t: -stateEst(dict(zip(self.edgeEvents.keys(),t)), (0.1,)*len(self.edgeEvents), constraints=cons, method='COBYLA')

stateEst定义为:

def stateEst(t):
    val = 0
    for edge,nextState in self.edgeEvents.iteritems():
        val += edge_probability(self,edge,ts) * estimates[nextState]
        val += node_probability(self, edge.head, ts, edge_list=[edge])* cost
    for node,nextState in self.nodeEvents.iteritems():
        val += node_probability(self, node, ts) * \
            (estimates[nextState] + cost*len([e for e in node.incoming if e in self.compEdges])
    return val

概率函数仅针对正 t 值进行定义。字典是必要的,因为概率是根据“命名”t 值计算的。

当我运行此命令时,我注意到 COBYLA 尝试将其中一个 t 值设置为 -0.025。为什么优化不遵守约束?

最佳答案

COBYLA 从技术上讲是一种不可行的方法,这意味着迭代对于您的约束可能并不总是可行!(这只是关于最终的收敛,其中可行性对于这些算法很重要)。

使用未在各处定义的目标函数将会出现问题。也许您被迫改用某种可行的方法

或者,您可以考虑概括您的目标,以便对负 t 进行惩罚。但这取决于问题,并且还可能引入其他问题(收敛;数值稳定性)。

尝试使用L-BFGS-B ,它仅限于边界约束,这在这里不是问题(对于您当前的问题!)。

关于python - Scipy.optimize COBYLA 约束违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454203/

相关文章:

python - 数组的 Numpy 矩阵没有复制可能吗?

python - 当 ctrl-C 不起作用时,终止由 vim 创建的 shell

c - 从UINT16到UINT8提取和组合位的更快方法

python - 将真实颜色列表与另一个颜色列表进行比较

python - 从文件中读取整数并将整数保存到列表 Python

python - 将 ManyToMany 字段从一个模型实例复制到另一个模型实例

python - 是否有一个更简单的 GridSearchCV 版本,只优化一个函数?

optimization - 解决 WebGL readPixels 缓慢的问题

python - 使用 Scipy.opt 进行 Andrew NG Logistic 回归中的形状误差

python - 如何正确设置带有约束和多个最优值的 scipy.optimize 最小化?