关于cvxpy的一些令人困惑的结果

时间:2019-01-17 07:51:38

标签: cvxpy

我用cvxpy做了一个非常简单的二次优化,遇到了一些令人困惑的问题。

问题1

score是一个1400 * 1 numpy数组,其中包含所有正浮点数。 我运行以下代码:

# Different N affects the result.
import numpy as np
import cvxpy as cp
w = cp.Variable(N,1))
objective = cp.Maximize(score[:N].T*w)
constraints = [w>=0,sum(w)==1]
prob = cp.Problem(objective,constraints)
prob.solve()

N是一个相对较小的整数(如300)时,w.value是向量[0,...,1,...,0],其中1处于score[:N]的最大数目的位置。显然,这就是我所阐述的。     但是,如果N大于约500,则w.value[1/N,1/N,...,1/N]的向量。我对结果完全感到困惑。

参数的尺寸为什么会影响优化?

问题2

我们仍然使用问题1中的参数。 另外,cov_mat是10 * 10 numpy矩阵。它是没有nan值的对称矩阵。 fac是1400 * 10 numpy矩阵。 定义:

sigma = fac.dot(cov_mat).dot(fac.T)
risk = cp.quad_form(w,sigma)

翻译员告诉我,风险是Expression(UNKNOWN, UNKNOWN, (1, 1)),而不是我预期的Expression(CONVEX, UNKNOWN, (1, 1))。结果,以下代码给出了警告*** cvxpy.error.DCPError: Problem does not follow DCP rules

N = len(score)
import numpy as np
import cvxpy as cp
w = cp.Variable(N,1))
sigma = fac.dot(cov_mat).dot(fac.T)
risk = cp.quad_form(w,sigma)
objective = cp.Maximize(score[:N].T*w-risk)
constraints = [w>=0,sum(w)==1]
prob = cp.Problem(objective,constraints)
prob.solve()

quad_form(w,sigma)是如何不凸出的表达式?我的代码中有任何错误吗?

问题3

我们仍然使用问题2中的参数。 我试图更换 risk = cp.quad_form(w,sigma)     与 risk = cp.quad_form(w,cp.Parameter(value=sigma,PSD=True,shape=sigma.shape))     在问题2的代码块中。最后,使用prob.status = 'optimal'解决了该问题。     但是,w.value包含大约700个负数,而我在约束中特别要求w>=0。     最佳结果怎么可能违反我的要求?

0 个答案:

没有答案