- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想使用 scipy.optimize 在大量线性不等式上最小化一个函数(最终是非线性的)。作为热身,我试图在 0<=x<=1、0<=y<=1 的方框上最小化 x+y。按照下面 Johnny Drama 的建议,我目前正在使用 dict-comprehesion 生成不等式字典,但没有得到预期的答案(最小值 = 0,最小值在 (0,0))。
新的代码部分(当前相关):
import numpy as np
from scipy.optimize import minimize
#Create initial point.
x0=[.1,.1]
#Create function to be minimized
def obj(x):
return x[0]+x[1]
#Create linear constraints lbnd<= A*(x,y)^T<= upbnd
A=np.array([[1,0],[0,1]])
b1=np.array([0,0])
b2=np.array([1,1])
cons=[{"type": "ineq", "fun": lambda x: np.matmul(A[i, :],x) -b1[i]} for i in range(A.shape[0])]
cons2=[{"type": "ineq", "fun": lambda x: b2[i]-np.matmul(A[i, :], x) } for i in range(A.shape[0])]
cons.extend(cons2)
sol=minimize(obj,x0,constraints=cons)
print(sol)
问题的原始版本:
我想使用 LinearConstraint 对象在 scipy.optimize 中,如教程中所述: "Defining linear constraints"
我尝试做一个更简单的例子,答案应该是显而易见的:在正方形 0<=x<=1, 0<=y<=1 上最小化 x+y。下面是我的代码,它返回错误“‘LinearConstraint’对象不可迭代”,但我看不出我是如何尝试迭代的。
编辑 1:该示例故意过于简单。最终,我想在大量线性约束下最小化非线性函数。我知道我可以使用字典理解将我的约束矩阵转换为字典列表,但我想知道“LinearConstraints”是否可以用作将矩阵转换为约束的现成方法。
编辑 2:正如 Johnny Drama 所指出的,LinearConstraint 是针对特定方法的。因此,在上面,我尝试使用他的建议来代替 dict-comprehension 来产生线性约束,但我仍然没有得到预期的答案。
原始代码部分(现在无关紧要):
from scipy.optimize import minimize
from scipy.optimize import LinearConstraint
#Create initial point.
x0=[.1,.1]
#Create function to be minimized
def obj(x):
return x[0]+x[1]
#Create linear constraints lbnd<= A*
#(x,y)^T<= upbnd
A=[[1,0],[0,1]]
lbnd=[0,0]
upbnd=[0,0]
lin_cons=LinearConstraint(A,lbnd,upbnd)
sol=minimize(obj,x0,constraints=lin_cons)
print(sol)
最佳答案
正如新手所说,使用 scipy.optimize.linprog
如果您想解决 LP(线性程序),即您的目标函数和您的约束是线性的。如果目标或约束之一不是线性的,我们将面临 NLP(非线性优化问题),可以通过 scipy.optimize.minimize
解决。 :
minimize(obj_fun, x0=xinit, bounds=bnds, constraints=cons)
其中 obj_fun
是您的目标函数,xinit
是初始点,bnds
是变量边界的元组列表,cons
约束指令列表。
这是一个例子。假设我们要解决以下 NLP:
由于所有约束都是线性的,我们可以用仿射线性函数 A*x-b
来表示它们,这样我们就有了不等式 A*x >= b
。这里 A
是一个 3x2 矩阵,b
是 3x1 右侧向量:
import numpy as np
from scipy.optimize import minimize
obj_fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2
A = np.array([[1, -2], [-1, -2], [-1, 2]])
b = np.array([-2, -6, -2])
bnds = [(0, None) for i in range(A.shape[1])] # x_1 >= 0, x_2 >= 0
xinit = [0, 0]
现在唯一剩下要做的就是定义约束,每个约束都必须是形式的字典
{"type": "ineq", "fun": constr_fun}
其中 constr_fun
是一个可调用函数,使得 constr_fun >= 0
。因此,我们可以定义每个约束
cons = [{'type': 'ineq', 'fun': lambda x: x[0] - 2 * x[1] + 2},
{'type': 'ineq', 'fun': lambda x: -x[0] - 2 * x[1] + 6},
{'type': 'ineq', 'fun': lambda x: -x[0] + 2 * x[1] + 2}]
然后我们就完成了。然而,事实上,对于许多约束来说,这可能是相当麻烦的。相反,我们可以通过以下方式直接传递所有约束:
cons = [{"type": "ineq", "fun": lambda x: A @ x - b}]
其中 @
表示 matrix multiplication operator .放在一起
res = minimize(obj_fun, x0=xinit, bounds=bnds, constraints=cons)
print(res)
产量
fun: 0.799999999999998
jac: array([ 0.79999999, -1.59999999])
message: 'Optimization terminated successfully.'
nfev: 16
nit: 4
njev: 4
status: 0
success: True
x: array([1.39999999, 1.69999999])
同样,您可以使用 LinearConstraint
对象:
from scipy.optimize import LinearConstraint
# lb <= A <= ub. In our case: lb = b, ub = inf
lincon = LinearConstraint(A, b, np.inf*np.ones(3))
# rest as above
res = minimize(obj_fun, x0=xinit, bounds=bnds, constraints=(lincon,))
编辑:回答您的新问题:
# b1 <= A * x <==> -b1 >= -A*x <==> A*x - b1 >= 0
# A * x <= b2 <==> A*x - b2 <= 0 <==> -Ax + b2 >= 0
cons = [{"type": "ineq", "fun": lambda x: A @ x - b1}, {"type": "ineq", "fun": lambda x: -A @ x + b2}]
sol=minimize(obj,x0,constraints=cons)
print(sol)
关于python - scipy.optimize 中的线性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001922/
我正在尝试运行以下代码片段,以使曲线适合一些经验数据,但在Julia Optim.jl包中,optimize()方法一直存在问题。我正在使用Julia v1.1.0,并安装了所有正确的软件包。我不断收
时不时你会听到一些故事,这些故事旨在说明某人在某件事上有多擅长,有时你会听到这个人如何热衷于代码优化,以至于他优化了他的延迟循环。 因为这听起来确实是一件奇怪的事情,因为启动“计时器中断”而不是优化的
我正在尝试使用 z3py 作为优化求解器来最大化从一张纸上切出的长方体的体积。 python API 提供了 Optimize() 对象,但使用它似乎不可靠,给我的解决方案显然不准确。 我尝试使用 h
我今天接受了采访。这个问题是为了优化下面的代码。如果我们将在 for 循环之后看到下面的代码,那么下面有四个“if-else”步骤。所以,面试官要求我将其优化为 3 if-else 行。我已经尝试了很
我使用BFGS算法使用Optim.jl库来最小化Julia中的函数。今天,我问了一个关于同一个库的question,但是为了避免混淆,我决定将它分成两部分。 我还想对优化后的负逆黑森州进行估算,以进行
在 haskell 平台中实现许多功能时有一个非常常见的模式让我很困扰,但我找不到解释。这是关于使用嵌套函数进行优化。 where 子句中的嵌套函数旨在进行尾递归的原因对我来说非常清楚(如 lengt
我目前正试图利用 Julia 中的 Optim 包来最小化成本函数。成本函数是 L2 正则化逻辑回归的成本函数。其构造如下; using Optim function regularised_cost
我正在使用 GEKKO 来解决非线性规划问题。我的目标是将 GEKKO 性能与替代方案进行比较,因此我想确保我从 GEKKO 中获得其所能提供的最佳性能。 有n个二元变量,每个变量都分配有一个权
我可以手动更改参数C和epsilon以获得优化结果,但我发现有PSO(或任何其他优化算法)对SVM进行参数优化。没有算法。什么意思:PSO如何自动优化SVM参数?我读了几篇关于这个主题的论文,但我仍然
我正在使用 scipy.optimize.fmin_l_bfgs_b 来解决高斯混合问题。混合分布的均值通过回归建模,其权重必须使用 EM 算法进行优化。 sigma_sp_new, func_val
当你有一个 Option ,编译器知道 NULL永远不是 &T 的可能值, 和 encodes the None variant as NULL instead .这样可以节省空间: use std:
当你有一个 Option ,编译器知道 NULL永远不是 &T 的可能值, 和 encodes the None variant as NULL instead .这样可以节省空间: use std:
以下是说明我的问题的独立示例。 using Optim χI = 3 ψI = 0.5 ϕI(z) = z^-ψI λ = 1.0532733 V0 = 0.8522423425 zE = 0.598
根据MySQL文档关于Optimizing Queries With Explain : * ALL: A full table scan is done for each combination o
我无法预览我的 Google 优化工具体验。 Google 优化抛出以下错误: 最佳答案 我也经常遇到这种情况。 Google 给出的建议是错误的。清除 cookie 并重新启动浏览器并不能解决问题。
我一直在尝试使用 optim()或 optimize()函数来最小化绝对预测误差的总和。 我有 2 个向量,每个长度为 28,1 个包含预测数据,另一个包含过去 28 天的实际数据。 fcst和 ac
在我对各种编译器书籍和网站的独立研究中,我了解到编译器可以优化正在编译的代码的许多不同方法,但我很难弄清楚每种优化会带来多少好处给予。 大多数编译器编写者如何决定首先实现哪些优化?或者哪些优化值得付出
我在我的项目中使用 System.Web.Optimizations BundleConfig。我在我的网站上使用的特定 jQuery 插件遇到了问题。如果我将文件添加到我的 ScriptBundle
我收到这个错误 Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.
scipy的optimize.fmin和optimize.leastsq有什么区别?它们似乎在 this example page 中以几乎相同的方式使用.我能看到的唯一区别是 leastsq 实际上
我是一名优秀的程序员,十分优秀!