0

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

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 が凸計画問題用に設計されていない他のアルゴリズムよりもこの問題を解決するのに苦労しているのか、私にはよくわかりません。制約を書いた方法で何かを見落としていませんか?

* 編集 *

これまで回答が得られなかったので、 CVXPY Google グループでもこの質問をします。それに応じてこのスレッドを更新します。

4

1 に答える 1

0

私は自分の問題を解決することができました。解決策は、Numpy 関数を使用してロジット分布の数値を保存し、そのコンポーネントを制約で使用することでした。

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] ]
于 2016-12-17T20:49:28.503 に答える