numpy 最小化 COBYLA 约束



我正在使用 scipy.minimale和 COBYLA 方法,但我似乎无法正确编写约束,因为当我检查目标函数的值时,它们不尊重这些约束。

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

  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)

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

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

最新更新