【问题标题】:How to figure out optimum inputs to regression equation given parameters and constraints using scipy.optimize如何使用 scipy.optimize 计算给定参数和约束的回归方程的最佳输入
【发布时间】:2021-06-29 17:43:29
【问题描述】:

我需要做一些优化,但我的经验很少,也不是 100% 从哪里开始。

假设我有一个回归方程;

y = exp(intercept + beta1 * x1 + beta2 * x2)

我如何使用 scipy.optimize 来找到 x1 和 x2 的输入,这将使给定的 y 最大化;

intercept = 10
beta1 = 1.1
beta2 = 1.2

Constraints;
(x1 + x2) has to be less than 10
x1 has to be greater than x2

我不想强行使用它(即手动计算 x1 和 x2 的每个组合的 y)。这是一个非常简单的示例,我希望从中学习和构建。

【问题讨论】:

  • 约束优化是一件疯狂而美妙的事情。开始的地方是绘制要优化的函数的轮廓(即上面的 y = ...),然后在其上绘制约束(只需将其打印出来并在需要时手动绘制),然后寻找其中轮廓显示最大值,在约束上或约束内。 (顺便说一句,是否有额外的约束 x1 > 0 和 x2 > 0?需要考虑。)如果你走得那么远,请告诉我,我会尝试提供更多建议。 PS。不要排除在网格上评估函数并寻找最大值——这是一个好的开始。
  • 感谢您的评论罗伯特。当然,这一切都很有意义,但我的问题是关于使用 scipy 来执行此操作、语法以及如何设置它。编写一个循环并在满足约束的每个状态下评估函数是相当简单的。
  • 从 scipy 文档看来,Constrained minimization of multivariate scalar functions 是一个不错的起点。
  • 感谢您的建议!
  • @RobertDodier 我看了你建议的文档。我想我需要一个像 linprog() 这样的解决方案,但它只允许我通过将系数作为权重传递来指定一个线性方程。有没有办法像我的例子一样传递非线性函数?

标签: python optimization scipy scipy-optimize-minimize


【解决方案1】:

我找到了一个名为 gekko 的包,它可以按照我的需要进行非线性优化。可以在此处找到该软件包的完整文档; Gekko Documentation

这是我用来解决简单示例问题的代码:

from gekko import GEKKO
m = GEKKO() # Initialize gekko

# Initialize variables
x1 = m.Var(value=1,lb=0,ub=10) 
x2 = m.Var(value=1,lb=0,ub=10) 

# Init the coefficients
alpha = m.Const(value=7) 
beta1 = m.Const(value=1.01) 
beta2 = m.Const(value=1.02) 

# Inequality constraints
m.Equation(x1 + x2 <= 10)
m.Equation(x2 < x1)

m.Obj(-1 * m.exp(alpha + x1*beta1 + x2*beta2)) # Objective
m.options.IMODE = 3 # Steady state optimization set to 3, change to 1 for integer
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 2018-07-27
    • 2019-08-29
    • 2018-08-19
    • 2017-05-23
    相关资源
    最近更新 更多