Numpy 最小化 COBYLA 约束

Numpy Minimize COBYLA Constraints

我正在使用 scipy.minimize 和 COBYLA 方法,但我似乎无法正确编写约束,因为当我检查 objective 函数的值时,它们不遵守这些约束.

基本上,objective 函数接受一个数组作为参数,它必须遵循两个约束:

  1. 数组中的每个值都必须大于 0
  2. 值的总和必须小于 1

到目前为止我是这样写的:

constraints = [{'type': 'ineq', 'fun': lambda x: 1 - sum(x)},
               {'type': 'ineq', 'fun': lambda x: x[0]},
               {'type': 'ineq', 'fun': lambda x: x[1]}]

但是,有时我得到的值大于 1...

这是一个例子:

from __future__ import division
from math import pow, exp
import numpy as np
from scipy.optimize import minimize

nbStudy = 3
nbCYP = 2
raucObserved = [3.98, 2.0, 0.12]
IXmat = np.matrix([[-0.98, 0], [-0.3, -0.98], [7.7, 4.2]])

NBITER = 50
estimatedCR = []
raucPred = []
varR = [0.0085, 0.0048, 0.0110]
sdR = [0.0922, 0.0692, 0.1051]

cnstrts = [{'type': 'ineq', 'fun': lambda x: 1 - sum(x)},
               {'type': 'ineq', 'fun': lambda x: x}]


def fun(CR):
    dum = []

    for i in range(nbStudy):
        crix = 0

        for j in range(nbCYP):
            crix += CR[j] * IXmat[i, j]

        raucPredicted = 1 / (1 + crix)
        dum.append(pow((np.log(raucPredicted) - np.log(raucObservedBiased[i])), 2) / varR[i])

    output = np.sum(dum)

    return output


for iter in range(NBITER):
    raucObservedBiased = []

    for k in range(nbStudy):
        raucObservedBiased.append(raucObserved[k] * exp(sdR[k] * np.random.normal()))

    initialCR = np.matrix([[(1 / nbCYP) * np.random.uniform()], [(1 / nbCYP) * np.random.uniform()]])

    output = minimize(fun, initialCR, method='COBYLA', constraints=cnstrts)
    estimatedCR.append(output.x)

您没有检查求解器是否收敛 (output.success == True) --- 在您的情况下它没有收敛。如果没有收敛,则无法保证约束。

显然是版本问题,此问题已修复。我使用的是 Python 2.7 和 Scipy 0.13...