使用 CVXPY 的熵最大化 unbounded/infeasible
Entropy maximization unbounded/infeasible using CVXPY
我正在尝试使用 CVXPY 以数值方式解决熵最大化问题。即使问题通过了 DCP 检查,我仍然得到无限结果,以及问题状态,如不可行和 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 group上问这个问题。我将相应地更新此线程。
我设法解决了我的问题。解决方案是使用 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] ]
我正在尝试使用 CVXPY 以数值方式解决熵最大化问题。即使问题通过了 DCP 检查,我仍然得到无限结果,以及问题状态,如不可行和 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 group上问这个问题。我将相应地更新此线程。
我设法解决了我的问题。解决方案是使用 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] ]