2016-12-12 30 views
0

私はCVXPYを使って数値的にエントロピー最大化問題を解こうとしています。問題がDCPの検査に合格しても、無限の結果が得られ、infeasibleやunbounded_inaccurateのような問題のステータスが表示されます(パラメータの値によって異なります)。私は、RでAlabamaのような非線形制約付きオプティマイザを使用して同じ問題を解決することができます。以下は問題を再現する小さな例です。CVXPYを使ってエントロピー最大化を無限/不可能

import cvxpy as cvx 

vals = array([ 750., 770., 790., 810., 830., 850., 870., 890., 
     910., 930., 950., 970., 990., 1010., 1030., 1050., 
     1070., 1090., 1110., 1130.]) 

n = size(freq) 
z = cvx.Variable(2,n) 

a = cvx.Parameter(sign="positive", value=989.) 
b = cvx.Parameter(sign="positive", value=.1) 
d = cvx.Parameter(sign="positive", value=10.) 

obj = cvx.Maximize(cvx.sum_entries(cvx.entr(z))) 

cons = [] 
cons += [ z >= 0., cvx.sum_entries(z) == 1, cvx.sum_entries(z, axis=0) * vals == a ] 

for i in range(n): 
    cons += [ cvx.logistic(b*(vals[i] - a - d)) * z[1,i] == cvx.exp(b*(vals[i] - a - d)) * (z[0,i] + z[1,i]) ] 

prob = cvx.Problem(obj, cons) 
prob.solve(solver=cvx.SCS) 

なぜCVXが凸型プログラミングの問題のために設計されていない他のアルゴリズムよりもこの問題を解決するのが難しいのか分かりません。私が制約を書いたやり方で何かを見過ごしたことはありますか?これまでのところ、答えを受けなかった

* EDIT *

、私はまたCVXPY Google groupにこの質問をします。私はそれに応じてこのスレッドを更新します。

答えて

0

私は私の問題を解決することができました。解決策は、Numpy関数を使用してlogit分布の数値を格納し、制約内のそのコンポーネントを使用することでした。

qre = np.exp(b.value*(vals - a - d.value))/(1.+np.exp(b.value*(vals - a - d.value))) 
... 
cons += [ qre[i] * (z[0,i]+z[1,i]) == z[1,i] ] 
関連する問題