Python ValueError:在CVXPY最小化函数中设置具有序列的数组元素
我试图用cvxpy解决一个凸问题,如下所示Python ValueError:在CVXPY最小化函数中设置具有序列的数组元素,python,optimization,minimize,cvxpy,convex-optimization,Python,Optimization,Minimize,Cvxpy,Convex Optimization,我试图用cvxpy解决一个凸问题,如下所示 import cvxpy as cp import numpy as np # Problem data. Q = np.array([[13, 12, -2], [12, 17, 6], [-2, 6, 12]]) q = np.array([[-22, -14.5, 13]]) r = 1 # Construct the proble
import cvxpy as cp
import numpy as np
# Problem data.
Q = np.array([[13, 12, -2], [12, 17, 6], [-2, 6, 12]])
q = np.array([[-22, -14.5, 13]])
r = 1
# Construct the problem.
x = cp.Variable((3,1))
objective = cp.Minimize(np.dot(np.dot(x.T, Q), x) + np.dot(q, x) + r)
constraints = [0 <= x[0:], x[0:] <= 1]
prob = cp.Problem(objective, constraints)
# The optimal objective value is returned by `prob.solve()`.
result = prob.solve()
# The optimal value for x is stored in `x.value`.
print(x.value)
# The optimal Lagrange multiplier for a constraint is stored in
# `constraint.dual_value`.
print(constraints[0].dual_value)
我不知道为什么会发生这个错误,因为其他一切似乎都正常
编辑:如果需要问题陈述,请告诉我。请参阅上面的评论:
import cvxpy as cp
import numpy as np
# Problem data.
Q = np.array([[13, 12, -2], [12, 17, 6], [-2, 6, 12]])
q = np.array([[-22, -14.5, 13]])
r = 1
# Construct the problem.
x = cp.Variable((3,1))
# WE CAN'T USE NUMPY'S DOT
# ALSO: WE WANT TO EXPRESS AS MUCH STRUCTURE AS POSSIBLE -> cp.quad_form()!
# q*x is cvxpy-compatible expression -> quite algebraic compared to numpy
# -------------------------------------------------------------------------
objective = cp.Minimize(cp.quad_form(x, Q) + q*x + r)
# ORIGINAL SLICING IS A NO-OP
# ---------------------------
constraints = [0 <= x, x <= 1]
prob = cp.Problem(objective, constraints)
# The optimal objective value is returned by `prob.solve()`.
result = prob.solve()
# The optimal value for x is stored in `x.value`.
print(x.value)
# The optimal Lagrange multiplier for a constraint is stored in
# `constraint.dual_value`.
print(constraints[0].dual_value)
错误不完整,stacktrace甚至可能显示有问题的行。此外,您可能在复制粘贴该代码时出错,或者您的cvxpy版本很旧,因为
cp.Variable(3,1)
不应该这样做。但是,您通常的问题是,您使用cvxpy的方式不正确:cvxpy提供了原子函数,并重载了一些运算符,因此它可以在内部生成一些表达式图。在传递给cvxpy的表达式中使用非cvxpy内容是不允许的np.dot
不应该在那里。原因1:cvxpy不知道如何处理它(它是外部的东西)原因2:np.dot()是一个不太代数的表达式,而cvxpy允许像a*x
(mat-vec-mul)这样的代数表达式,例如numpy需要点的地方。理由3:我想你想要cvxpy的quad\u表单
表达式。@sascha谢谢你的评论。我遗漏了x=cp.Variable(3,1)周围的另一对括号。此后,我添加了它们以进行适当的调试。此外,我将研究您提供调试的原因。
import cvxpy as cp
import numpy as np
# Problem data.
Q = np.array([[13, 12, -2], [12, 17, 6], [-2, 6, 12]])
q = np.array([[-22, -14.5, 13]])
r = 1
# Construct the problem.
x = cp.Variable((3,1))
# WE CAN'T USE NUMPY'S DOT
# ALSO: WE WANT TO EXPRESS AS MUCH STRUCTURE AS POSSIBLE -> cp.quad_form()!
# q*x is cvxpy-compatible expression -> quite algebraic compared to numpy
# -------------------------------------------------------------------------
objective = cp.Minimize(cp.quad_form(x, Q) + q*x + r)
# ORIGINAL SLICING IS A NO-OP
# ---------------------------
constraints = [0 <= x, x <= 1]
prob = cp.Problem(objective, constraints)
# The optimal objective value is returned by `prob.solve()`.
result = prob.solve()
# The optimal value for x is stored in `x.value`.
print(x.value)
# The optimal Lagrange multiplier for a constraint is stored in
# `constraint.dual_value`.
print(constraints[0].dual_value)
[[ 8.46153846e-01]
[-6.34467676e-25]
[-1.92032635e-25]]
[[0. ]
[5.80769231]
[9.61538462]]