在 cvxpy 中解决优化问题时,是否有一种很好的方法可以通过替换优化变量的实际值来检查约束是否有效?
我有一个复杂的优化问题(100 多个约束),但我知道最佳解决方案应该是什么。但是, cvxpy 失败并显示错误消息ValueError: Rank(A) < p or Rank([G; A]) < n
我认为这是因为我在其中一个约束中有一个错字,使它们不一致。有没有一种很好的方法来替换变量的实际值,以查看违反了哪些约束(因为它们可能有拼写错误)?
我的实际问题很复杂,所以我做了一个简单的例子:
from cvxpy import *
x = variable(name='x')
y = variable(name='y')
c1 = greater_equals(x, 1.)
c2 = greater_equals(y, 1.)
c3 = less_equals(x + y, -4.) # typo: -4 should be +4
p = program(maximize(2. * x + y), [c1, c2, c3])
p.solve()
Run Code Online (Sandbox Code Playgroud)
将-4在约束c3应该是+4。这失败并显示错误消息:Certificate of primal infeasibility found.
如果我输入,p.show()我得到:
maximize 2.0*x + y
subject to …Run Code Online (Sandbox Code Playgroud) 我对optim函数不是很熟悉,我想从结果中得到这些信息:a)实现结果需要多少次迭代?和b)绘制部分解的序列,即在每次迭代结束时获得的解.
我的代码到现在看起来像这样:
f1 <- function(x) {
x1 <- x[1]
x2 <- x[2]
x1^2 + 3*x2^2
}
res <- optim(c(1,1), f1, method="CG")
Run Code Online (Sandbox Code Playgroud)
如何改进它以获得更多信息?
提前致谢
我想解析以蓝色显示的以下多边形,从多边形中删除导致凹陷的所有点.

目前,我一直试图做的是:
这在大多数情况下都有效,但在前一种情况下,(2,3)和(2,4)处的点都不会被删除.在这两种情况下,其中一个点将被删除,但另一个点将不依赖于传入数组的顺序.
我想知道的是:
谢谢.
geometry convex-optimization convex-polygon computational-geometry
我试图使用fminunc函数进行凸优化.但是,在我的情况下,我正在考虑与logx相关的渐变.让我的目标函数为F.然后梯度将是
dF/dx = (dF/dlogx) * (1/x)
= > dF/dlogx = (dF/dx) * x
Run Code Online (Sandbox Code Playgroud)
所以
logx_new = logx_old + learning_rate * x * (dF/logx)
x_new = exp(logx_new)
Run Code Online (Sandbox Code Playgroud)
我怎样才能在fminunc中实现它
我正在尝试使用 CVXPY 模拟精确线搜索实验。
objective = cvx.Minimize(func(x+s*grad(x)))
s = cvx.Variable()
constraints = [ s >= 0]
prob = cvx.Problem(objective, constraints)
obj = cvx.Minimize(prob)
Run Code Online (Sandbox Code Playgroud)
上面的方程是我的输入目标函数。
def func(x):
np.random.seed(1235813)
A = np.asmatrix(np.random.randint(-1,1, size=(n, m)))
b = np.asmatrix(np.random.randint(50,100,size=(m,1)))
c = np.asmatrix(np.random.randint(1,50,size=(n,1)))
fx = c.transpose()*x - sum(np.log((b - A.transpose()* x)))
return fx
Run Code Online (Sandbox Code Playgroud)
梯度函数
def grad(x):
np.random.seed(1235813)
A = np.asmatrix(np.random.randint(-1,1, size=(n, m)))
b = np.asmatrix(np.random.randint(50,100,size=(m,1)))
c = np.asmatrix(np.random.randint(1,50,size=(n,1)))
gradient = A * (1.0/(b - A.transpose()*x)) + c
return gradient
Run Code Online (Sandbox Code Playgroud)
使用此方法通过最小化目标函数来查找 t“步长”会导致错误“AddExpression”对象没有属性“log”。
我是 CVXPY …
我已经在支持向量机上工作了大约2个月了.我自己编写了SVM编码,对于SVM的优化问题,我使用了John Platt博士的Sequential Minimal Optimization(SMO).
现在我正处于我要进行网格搜索以找到我的数据集的最佳C值的阶段.(请在此处查找我的项目应用程序和数据集详细信息的详细信息SVM分类 - 每个类的最小输入集数量)
我已经成功检查了我自定义实现的SVM的精度,C值范围从2 ^ 0到2 ^ 6.但是现在我遇到了关于C> 128的SMO收敛的一些问题.就像我试图找到C = 128的alpha值一样,它在实际收敛并成功给出alpha值之前需要很长时间.
对于C = 100,SMO收敛所花费的时间约为5小时.这个巨大的我认为(因为SMO应该很快.)虽然我的准确度很高?我被搞砸了,因为我不能测试更高C值的准确性.
我实际上显示了SMO每次传递中更改的alpha数,并且让10,13,8 ... alphas不断变化.KKT条件确保收敛,所以这里发生了什么奇怪的事情?
请注意,虽然执行时间很长,但我的实现在C <= 100时工作正常且准确性很高.
请给我关于这个问题的意见.
谢谢你和干杯.
我在linprog R包中使用solveLP来解决一个简单的线性编程问题:
minimize -x1-x2
subject to 2*x1+x2+x3 =12
x1+2*x2 +x4 = 9
x1,x2,x3,x4 >=0
Run Code Online (Sandbox Code Playgroud)
具有双重等价物:
maximize 12*y1+9*y2
subject to 2*y1+y2 <= -1
y1+2*y2 <= -1
y1,y2 <=0
Run Code Online (Sandbox Code Playgroud)
如果我以原始形式陈述问题,我会得到正确的结果(5,2,0,0).但是当以双重形式陈述问题时,前两个约束只会被忽略.我得到的结果(0,0)显然违反了(2*y1 + y2 <= -1且y1 + 2*y2 <= -1),是否有额外的设置或参数我缺少?请查看下面的代码,让我知道您的想法:
require(linprog)
objVec <- c(-1,-1,0,0)
rhsConstr <- c(12, 9,0,0,0,0)
Amat <- rbind( c( 2, 1, 1, 0 ),
c( 1, 2, 0, 1 ),
c( 1, 0, 0, 0 ),
c( 0, 1, 0, 0 ),
c( 0, 0, 1, 0 ),
c( 0, 0, …Run Code Online (Sandbox Code Playgroud) 我需要在 Python 中使用 CVXOPT 或 CVXPY 解决优化问题,但遇到了困难。目标函数是
Minimize Sum(a*x^2+b/x)
Run Code Online (Sandbox Code Playgroud)
受以下限制
5 <= x < 40;
sum(v/d)<=T
Run Code Online (Sandbox Code Playgroud)
其中向量x是优化变量,向量a和b是给定的,并且T是给定的标量。
你会推荐任何凸优化库吗?
理想的开源.半定规划和QCQP的先验.
(我打算用fsharp和任何dotnet一起使用它)
我想将以下 SDP(它只是验证约束的可行性)从 CVX (MATLAB) 转换为 CVXPY (Python):
Ah = [1.0058, -0.0058; 1, 0];
Bh = [-1; 0];
Ch = [1.0058, -0.0058; -0.9829, 0.0056];
Dh = [-1; 1];
M = [0, 1;1, 0];
ni = size(M,1)/2;
n = size(Ah,1);
rho = 0.5;
cvx_begin sdp quiet
variable P(n,n) semidefinite
variable lambda(ni) nonnegative
Mblk = M*kron(diag(lambda),eye(2));
lambda(ni) == 1 % break homogeneity (many ways to do this...)
[Ah Bh]'*P*[Ah Bh] - rho^2*blkdiag(P,0) + [Ch Dh]'*Mblk*[Ch Dh] <= 0
cvx_end
switch cvx_status
case 'Solved' …Run Code Online (Sandbox Code Playgroud)