我在使用 Gekko 执行约束回归时收到以下错误消息:
> ----------------------------------------------------------------
APMonitor, Version 1.0.1
APMonitor Optimization Suite
----------------------------------------------------------------
--------- APM Model Size ------------
Each time step contains
Objects : 2
Constants : 0
Variables : 119
Intermediates: 0
Connections : 58
Equations : 59
Residuals : 59
Number of state variables: 3535109
Number of total equations: - 3535080
Number of slack variables: - 0
---------------------------------------
Degrees of freedom : 29
----------------------------------------------
Model Parameter Estimation with APOPT Solver
----------------------------------------------
Error: forrtl: severe (174): SIGSEGV, segmentation fault occurred
Stack trace terminated abnormally.
Error: 'results.json' not found. Check above for additional error details
为了找到原因,我查看了 gekko 路径并发现了以下文件:
APOPT.out
dbs_read.rpt
gk_model0.apm
gk_model0.csv
gk_model0.info
measurements.dbs
所以我无法理解导致问题的原因,因为没有生成不可行文件。 以下是我正在使用的代码:
def gk_enet(y, x, min_l2, indep_vars, sign_dict, l1_penalty=True):
# setting the Gekko solver
m = gk.GEKKO(remote=False)
m.options.MAX_ITER = 100000
m.options.IMODE = 2 # Regression mode
opt_path = m.path
print(m.path)
model_iter = opt_path.rsplit("_", 1)[1]
# assigning gekko solver to minimize SSE instead of default l1-norm minimizer
if l1_penalty != True:
m.options.EV_TYPE = 2
# setting up the model & parameters
# number of variables
n = x.shape[1]
# assigning array of parameters: c stands for coefficients
# assigning sign-restrictions based on sign_dict
c = m.Array(m.FV, n)
for i, ci in enumerate(c):
ci.STATUS = 1
if sign_dict[indep_vars[i]] > 0:
ci.LOWER = 0
elif sign_dict[indep_vars[i]] < 0:
ci.UPPER = 0
# parameter for l2-regularization
R = m.FV()
R.STATUS = 1
R.LOWER = min_l2
# array of gekko variable to predict the coefficients' effects
x_pred = [None]*n
# load data
xd = m.Array(m.Param, n)
#xd_intcpt = m.Array(m.Param, 1)
yd = m.Param(value=y)
for i in range(n):
xd[i].value = x[:, i]
x_pred[i] = m.Var() # y = sum(c[i]*x[i])
m.Equation(x_pred[i] == c[i]*xd[i])
y_pred = m.Var()
m.Equation(y_pred == m.sum([x_pred[i] for i in range(n)]))
l2_penalty = m.Var()
m.Equation(l2_penalty == R*m.sum([c[i]**2 for i in range(n)]))
# Minimize difference between actual and predicted y + l2-regularization factor
m.Minimize((yd-y_pred)**2 + l2_penalty)
# APOPT solver
m.options.SOLVER = 1
# Solve
try:
m.solve(disp=True)
a = [np.round(i.value[0], 4) for i in c]
except:
a = [0 for i in c]
return a, min_l2
解决此问题的任何建议都会非常有帮助。另外,如果需要任何进一步的信息才能获得解决方案,请告诉我。
编辑:感谢约翰的建议。我减少了数据并使用第一个 BPOPT 重新运行代码,然后使用 IPOPT 求解器。运行 BPOPT 求解器时出现以下错误:
MATRIX IS SINGULAR. RANK= 0
Problem with linear solver, INFO: 3
Error in initialization of lagrange multipliers
Setting lam(1:m) = 0
运行 IPOPT 时,收到以下消息:
solver 3 not supported
using default solver: APOPT
但这一次 APPT 求解器相当快地提供了解决方案。我还没有检查结果。 但查看 BPOPT 错误消息,我认为问题在于数据,即使对于之前未修剪数据的情况也是如此。 Gekko 中是否有任何调试选项可供我尝试找出答案?
求解器因分段错误而崩溃,因为它无法访问所需的内存。优化问题的规模:
Number of state variables: 3535109
Number of total equations: - 3535080
Number of slack variables: - 0
---------------------------------------
Degrees of freedom : 29
表明它可能接近
APOPT
求解器可以成功处理的上限。尝试切换到另一个求解器,例如 IPOPT
或 BPOPT
:
m.options.SOLVER = 'IPOPT'
没有迹象表明需要混合整数解决方案,因此从使用 APOPT 的混合整数非线性规划 (MINLP) 求解器切换到使用 IPOPT 的非线性规划 (NLP) 求解器可能会有所帮助。如果问题是二次约束二次规划 (QCQP),则有专门的求解器可能比 NLP 求解器工作得更好。
如果您可以提交带有随机生成数据的完整问题,APOPT 求解器的开发人员可以使用它来查找错误。您可以将问题作为新问题提交到 Gekko GitHub 或 APOPT GitHub 存储库。