如何使用 scipy.optimize 找出给定参数和约束的回归方程的最佳输入

问题描述

我需要做一些优化,但我的经验很少,而且不是 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)。这是一个非常简单的例子,我希望从中学习和构建。

解决方法

我找到了一个名为 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,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))