在python中推荐的约束非线性优化包是什么?
我试图解决的具体问题是:
我有一个未知的X(Nx1),我有M(Nx1)u向量和M(NxN)s矩阵.
max [5th percentile of (ui_T*X), i in 1 to M]
st
0<=X<=1 and
[95th percentile of (X_T*si*X), i in 1 to M]<= constant
Run Code Online (Sandbox Code Playgroud)
当我开始解决这个问题时,我只有一点估计值u,s并且我能够解决上面的问题cvxpy.
我意识到,而不是一个估计u和s,我有整个值的分布,所以我想改变我的目标函数,以便我可以使用整个分布.上面的问题描述是我尝试以有意义的方式包含该信息.
cvxpy不能用来解决这个问题,我试过了scipy.optimize.anneal,但我似乎无法对未知值设置界限.我也看过了,pulp但它不允许非线性约束.
我一直在尝试将一些代码从Matlab传递给Python.我在Matlab上有相同的凸优化问题但是我在将它传递给CVXPY或CVXOPT时遇到了问题.
n = 1000;
i = 20;
y = rand(n,1);
A = rand(n,i);
cvx_begin
variable x(n);
variable lambda(i);
minimize(sum_square(x-y));
subject to
x == A*lambda;
lambda >= zeros(i,1);
lambda'*ones(i,1) == 1;
cvx_end
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用Python和CVXPY.
import numpy as np
from cvxpy import *
# Problem data.
n = 100
i = 20
np.random.seed(1)
y = np.random.randn(n)
A = np.random.randn(n, i)
# Construct the problem.
x = Variable(n)
lmbd = Variable(i)
objective = Minimize(sum_squares(x - y))
constraints = [x == …Run Code Online (Sandbox Code Playgroud) 我正在尝试在目标函数中的 CVXPY 中进行元素乘法。这是否允许作为凸问题的一部分?
X是 anx 1 变量。
V是 anxn 常数。
我想做相当于np.multiply(X, V*X),它返回一个 nx 1 向量。
我想使用 CVXPY 解决这个问题,但我不知道为什么会收到以下错误消息:
DCPError:问题不遵循 DCP 规则。
我想我的限制不是DCP。有没有办法在 DCP 中对此进行建模?
n_k = [10000, 20000]
request_rate = [15, 10]
p_k_1 = np.random.rand(n_k[0])
p_k_2 = np.random.rand(n_k[1])
#params
p_k_param_1 = cvx.Parameter(1, n_k[0], sign="positive")
p_k_param_1 = np.array(p_k_1)
p_k_param_2 = cvx.Parameter(1, n_k[1], sign="positive")
p_k_param_2 = np.array(p_k_2)
request_rate_param = cvx.Parameter(2, sign="positive")
request_rate_param = np.array(request_rate)
#varibales
c_k = cvx.Variable(2)
T_k = cvx.Variable(2)
constraints = [ cvx.sum_entries(c_k) <= 10000,
c_k >= 0,
c_k[0]==cvx.sum_entries(1-cvx.exp(-request_rate_param[0]*T_k[0]*p_k_param_1)),
c_k[1]==cvx.sum_entries(1-cvx.exp((-request_rate_param[1]*T_k[1])*p_k_param_2))]
h_k_1 = request_rate_param[0] * cvx.sum_entries((p_k_param_1 * (1-cvx.exp(-request_rate_param[0]*T_k[0]*p_k_param_1))))
h_k_2 = request_rate_param[1]* cvx.sum_entries(p_k_param_2 * (1-cvx.exp(-request_rate_param[1]*T_k[1]*p_k_param_2)))
obj = …Run Code Online (Sandbox Code Playgroud) 我正在使用 CVXPY(版本 1.0)来解决二次程序(QP),我经常遇到这个异常:
求解器错误:求解器“xxx”失败。尝试另一个求解器。
这使我的程序非常脆弱。我尝试了不同的求解器,包括 CVXOPT、OSQP、ECOS、ECOS_BB、SCS。他们都或多或少有相同的问题。我注意到,当我使求解器的停止标准更严格(例如,降低绝对误差容限)时,我会变SolverError得更频繁,而当我使其不那么严格时,SolverError问题会减弱甚至消失。我还发现 CVXPY 抛出的方式SolverError是随机的:如果我多次运行同一个程序,有一些运行SolverError会获得最佳结果而另则会获得最佳结果。
虽然我可以通过尝试更多次并降低停止标准来避免 SolverError,但我真的很想了解异常背后的真正具体原因
求解器错误:求解器“xxx”失败。尝试另一个求解器。
这个错误并没有真正提供信息,我不知道如何提高解决问题的稳健性。其原因是否特定于求解器?是否为一组明确定义的情况抛出此异常?或者它只是一种说“由于未知原因出现问题”的方式?这些可能是什么原因?
convex-optimization numerical-stability cvxopt quadratic-programming cvxpy
在这段代码中:
import cvxpy as cvx
# Examples: linear programming
# Create two scalar optimization variables.
x = cvx.Variable()
y = cvx.Variable()
# Create 4 constraints.
constraints = [x >= 0,
y >= 0,
x + y >= 1,
2*x + y >= 1]
# Form objective.
obj = cvx.Minimize(x+y)
# Form and solve problem.
prob = cvx.Problem(obj, constraints)
prob.solve(warm_start= True) # Returns the optimal value.
print ("status:", prob.status)
print ("optimal value", prob.value)
print ("optimal var", x.value, y.value)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方式来选择温暖的起始值自己(例如:X …
尝试在Mac上使用pip install安装cvxpy软件包时,收到以下错误消息:
warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
In file included from cvxpy/cvxcore/src/cvxcore.cpp:15:
cvxpy/cvxcore/src/cvxcore.hpp:18:10: fatal error: 'vector' file not found
#include <vector>
^~~~~~~~
1 warning and 1 error generated.
error: command '/usr/bin/clang' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
Mac正在运行OS Mojave.
我正在尝试使用cvxpy优化包解决数独。我对优化和 cvxpy 都很陌生。
约束条件是:
所以,这是我的代码:
from cvxpy import *
import numpy as np
x = Variable((9, 9), integer=True)
obj = Minimize(sum(x)) #whatever, if the constrains are fulfilled it will be fine
const = [x >= 1, #all values should be >= 1
x <= 9, #all values should be <= 9
sum(x, axis=0) == 45, # sum of all rows should …Run Code Online (Sandbox Code Playgroud) 如何反转 cvxpy 中的变量矩阵?
我有一个问题变量矩阵,定义如下:
import cvxpy as cp
A = cp.Variable(2,2)
Run Code Online (Sandbox Code Playgroud)
我想求解一个具有涉及该矩阵逆的目标函数的程序。我几乎尝试了所有我能想到的方法(包括手动定义逆矩阵),但似乎没有任何效果。
我的问题的完整代码是:
A = cp.Variable((2,2)) # matrix A is 2X2
c = cp.Variable(2) # center of 2d ellipsoid
constraints = [A >> 0]
constraints += [cp.pnorm(cp.matmul(A, v[i] - cp.matmul(A,c)), p=2) <= np.array([1,1]) for i in range(10)]
# this is where I'm stuck. Using np.linalg.inv doesn't work.
# I also can't seem to calculate this inverse manually
obj_fn = cp.log_det(np.linalg.inv(A))
prob = cp.Problem(cp.Minimize(obj_fn), constraints)
prob.solve(solver='CVXOPT')
Run Code Online (Sandbox Code Playgroud) Fused Lasso (Tibshirani 等人,2005)鼓励系数的稀疏性及其差异的稀疏性。
这是损失函数和正则化的公式:
第一项是 L2 (mse) 损失,第二项是对系数的 L1 惩罚(Lasso 正则化),最后一项是链接文章中引入的新项。
我如何用cvxpy包来模仿这个 - 具体来说,我如何实现最后一项?
分别有Lasso和Ridge Penalties 的示例代码。我大致了解这些代码是如何工作的,但有一些功能我不知道我应该如何决定使用哪一个。例如,让我们比较 Lasso 和 Ridge 惩罚代码。
# Lasso
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
def loss_fn(X, Y, beta):
return cp.norm2(cp.matmul(X, beta) - Y)**2
def regularizer(beta):
return cp.norm1(beta)
def objective_fn(X, Y, beta, lambd):
return loss_fn(X, Y, beta) + lambd * regularizer(beta)
def mse(X, Y, beta):
return (1.0 / X.shape[0]) * loss_fn(X, Y, beta).value …Run Code Online (Sandbox Code Playgroud)