我正在使用 scipy.optimize.minimize
的 COBYLA 方法来寻找一个用于分类分布的参数矩阵。我需要设定一个约束条件,要求每个参数都大于零,并且参数矩阵的每一行的和是一个由1组成的列向量。
我还不清楚如何在 scipy.minimize
中实现这个约束,因为系统检查的是非负性而不是真实性。如果我直接将数组作为约束传递, minimization 会抛出异常。
有谁知道如何实现这种类型的约束吗?
回答:
第一个约束 x > 0
可以非常简单地表达为:
{'type':'ineq', 'fun': lambda x: x}
第二个约束是一个等式约束,COBYLA 并不原生支持。然而,你可以将其表述为两个独立的不等式约束:
{'type':'ineq', 'fun': lambda x: np.sum(x, 0) - 1} # 行和 >= 1{'type':'ineq', 'fun': lambda x: 1 - np.sum(x, 0)} # 行和 <= 1
否则,你可以尝试使用 SLSQP,它确实支持等式约束。