私はCOBYLAメソッドでscipy.minimizeを使用していますが、目的関数の値をチェックするときに制約を遵守しないため、制約を正しく書き込めないようです。Numpy COBYLA制約を最小化する
基本的に、目的関数は、2つの制約に従わなければならない引数として配列を受け付ける:
- 配列内の各値が0
- より大きくなければならない値の合計が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)
あなたは例を挙げることができますか? – cel
私は最小限の作業の例に少し力を注いでいます。そのようにすれば、いくつかの助けを得る可能性が高くなります。 – rll
まあ、私は公式のドキュメンテーションが非常に軽いので、知識が豊富な人からの洞察を得ることを望んでいました。 しかしifあなたは本当に実用的な例が必要です。私は1つを生成しようとします(私の実際のコードは、多くの側計算を意味する...) – remitod