Numpy最小化COBYLA约束

时间:2016-07-13 16:10:39

标签: python numpy scipy constraints minimize

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

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

  1. 数组中的每个值必须大于0
  2. 值的总和必须低于1
  3. 到目前为止,我用这种方式写了:

    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)
    

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

显然是版本问题,此问题已得到解决。我使用的是Python 2.7和Scipy 0.13 ......