2016-07-13 21 views
-1

私はCOBYLAメソッドでscipy.minimizeを使用していますが、目的関数の値をチェックするときに制約を遵守しないため、制約を正しく書き込めないようです。Numpy COBYLA制約を最小化する

基本的に、目的関数は、2つの制約に従わなければならない引数として配列を受け付ける:

  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) 
+0

あなたは例を挙げることができますか? – cel

+0

私は最小限の作業の例に少し力を注いでいます。そのようにすれば、いくつかの助けを得る可能性が高くなります。 – rll

+0

まあ、私は公式のドキュメンテーションが非常に軽いので、知識が豊富な人からの洞察を得ることを望んでいました。 しかしifあなたは本当に実用的な例が必要です。私は1つを生成しようとします(私の実際のコードは、多くの側計算を意味する...) – remitod

答えて

0

あなたは、ソルバーが収束したことを確認されていません(output.success == TRUE)---とであなたのケースは収束しません。コンバージェンスがない場合、制約について何も保証されません。

+0

それは収束します!私は毎回output.success == Trueを得る... – remitod

0

明らかにバージョンの問題です。問題はこれ以降修正されています。私はPython 2.7とScipy 0.13を使っていました...

関連する問題