Optimization 是否有通过声明已知和未知变量来解决优化问题的包装器库?
有一个非常简洁的方法来写出优化表单,而不用太担心将其转换为“标准”矩阵表单,因为这是以某种方式在内部完成的。最好用一个例子来解释:Optimization 是否有通过声明已知和未知变量来解决优化问题的包装器库?,optimization,scipy,cvxpy,Optimization,Scipy,Cvxpy,有一个非常简洁的方法来写出优化表单,而不用太担心将其转换为“标准”矩阵表单,因为这是以某种方式在内部完成的。最好用一个例子来解释: def cvxpy_implementation(): var1 = cp.Variable() var2 = cp.Variable() constraints = [ var1 <= 3, var2 >= 2 ] obj_fun = cp.Minimize(
def cvxpy_implementation():
var1 = cp.Variable()
var2 = cp.Variable()
constraints = [
var1 <= 3,
var2 >= 2
]
obj_fun = cp.Minimize(var1**2 + var2**2)
problem = cp.Problem(obj_fun, constraints)
problem.solve()
return var1.value, var2.value
def scipy_implementation1():
A = np.diag(np.ones(2))
lb = np.array([-np.inf, 2])
ub = np.array([3, np.inf])
con = LinearConstraint(A, lb, ub)
def obj_fun(x):
return (x**2).sum()
result = minimize(obj_fun, [0, 0], constraints=con)
return result.x
def scipy_implementation2():
con = [
{'type': 'ineq', 'fun': lambda x: 3 - x[0]},
{'type': 'ineq', 'fun': lambda x: x[1] - 2},]
def obj_fun(x):
return (x**2).sum()
result = minimize(obj_fun, [0, 0], constraints=con)
return result.x
def cvxpy_实现():
var1=cp.Variable()
var2=cp.Variable()
约束=[
var1=2
]
obj_fun=cp.Minimize(var1**2+var2**2)
问题=cp.问题(目标、约束)
解决问题
返回var1.value,var2.value
def scipy_实现1():
A=np.diag(np.one(2))
lb=np.array([-np.inf,2])
ub=np.array([3,np.inf])
con=线性约束(A、lb、ub)
def obj_fun(x):
返回(x**2).sum()
结果=最小化(目标函数[0,0],约束=con)
返回结果.x
def scipy_实现2():
con=[
{'type':'ineq','fun':lambda x:3-x[0]},
{'type':'ineq','fun':lambda x:x[1]-2},]
def obj_fun(x):
返回(x**2).sum()
结果=最小化(目标函数[0,0],约束=con)
返回结果.x
所有这些都给出了正确的结果,但是cvxpy实现更容易写出,特别是我不必担心不等式,并且可以在写出不等式时命名有用的变量。与scipy1和scipy2实现相比,在第一种情况下,我必须写出这些额外的inf
s,在第二种情况下,我必须记住哪个变量是哪个变量。您可以想象这样一种情况,我有100个变量,当连接它们时,最终需要完成,我希望能够像在cvxpy中那样写出它
问题:
有人为scipy实现了这个吗?或者有没有其他的图书馆可以使这项工作
谢谢你写了一些可以做到这一点的东西,似乎涵盖了我想到的主要问题 一般的想法是定义变量,然后创建一个简单的表达式,就像通常写出来的那样,然后解算器类对定义的变量进行优化 下面的示例演示了一个简单的用例
# fake data
a = 2
m = 3
x = np.linspace(0, 10)
y = a * x + m + np.random.randn(len(x))
a_ = Variable()
m_ = Variable()
y_ = a_ * x + m_
error = y_ - y
prob = Problem((error**2).sum(), None)
prob.minimize() print(f'a = {a}, a_ = {a_}') print(f'm = {m}, m_ = {m_}')
对西皮来说,没有比这更好的了。当针对某些特定的优化问题(纸浆、pyomo)时,您可能会找到类似的软件。但首先你需要明白,上面的例子是不可比较的!归结起来,这是通过构造凸假设解算器(cvxpy的核心用例)强制实现的凸性,而不是仅假设两次可微性的一般非线性规划(scipy最小化)。专注于python,您可能会有点嫉妒,因为您是对的,这很简洁,尽管我仍然认为有一些多余的语法,但在其他方面看起来非常干净