是否有通过声明已知和未知变量来解决优化问题的包装库?
Is there a wrapper library for solving optimisation problems by declaring known and unknown variables?
cvxpy
有一种非常简洁的方法来写出优化形式,而不必太担心将其转换为 "standard" 矩阵形式,因为这是在内部以某种方式完成的。最好举例说明:
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
以上所有都给出了正确的结果,但是 cvxpy 的实现有很多 "easier" 需要写出来,具体来说,我不必担心不等式,并且可以命名变量在写出不等式时有用的想法.将其与 scipy1 和 scipy2 实现进行比较,在第一种情况下,我必须写出这些额外的 inf
s,而在第二种情况下,我必须记住哪个变量是哪个。您可以想象我有 100 个变量的情况,虽然最终需要将它们连接起来,但我希望能够像在 cvxpy 中那样写出来。
问题:
有人为 scipy 实施过这个吗?或者是否有替代库可以使这项工作正常进行?
谢谢
写了一些可以做到这一点的东西,似乎涵盖了我想到的主要问题。
一般的想法是定义变量,然后创建一个简单的表达式,就像您通常写出来的那样,然后求解器 class 优化定义的变量
https://github.com/evan54/optimisation/blob/master/var.py
下面的示例说明了一个简单的用例
# 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_}')
cvxpy
有一种非常简洁的方法来写出优化形式,而不必太担心将其转换为 "standard" 矩阵形式,因为这是在内部以某种方式完成的。最好举例说明:
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
以上所有都给出了正确的结果,但是 cvxpy 的实现有很多 "easier" 需要写出来,具体来说,我不必担心不等式,并且可以命名变量在写出不等式时有用的想法.将其与 scipy1 和 scipy2 实现进行比较,在第一种情况下,我必须写出这些额外的 inf
s,而在第二种情况下,我必须记住哪个变量是哪个。您可以想象我有 100 个变量的情况,虽然最终需要将它们连接起来,但我希望能够像在 cvxpy 中那样写出来。
问题: 有人为 scipy 实施过这个吗?或者是否有替代库可以使这项工作正常进行?
谢谢
写了一些可以做到这一点的东西,似乎涵盖了我想到的主要问题。
一般的想法是定义变量,然后创建一个简单的表达式,就像您通常写出来的那样,然后求解器 class 优化定义的变量
https://github.com/evan54/optimisation/blob/master/var.py
下面的示例说明了一个简单的用例
# 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_}')