我用cvxpy做了一个非常简单的二次优化,遇到了一些令人困惑的问题。
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]
的向量。我对结果完全感到困惑。
参数的尺寸为什么会影响优化?
我们仍然使用问题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)
是如何不凸出的表达式?我的代码中有任何错误吗?
我们仍然使用问题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
。
最佳结果怎么可能违反我的要求?