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,您可能会有点嫉妒,因为您是对的,这很简洁,尽管我仍然认为有一些多余的语法,但在其他方面看起来非常干净