我通过最小化数千个方程来求解 14 个变量IMODE = 3
in GEKKO
.
每个方程都是真实响应与 P 样条模型预测之间的平方误差 (i.e.,惩罚 B 样条):
eq[i] = m.Minimize((y_true[i] - spline(coeffs, knots, vars)[i]) ** 2)
.
样条模型由系数和节点(之前计算)以及 14 个要优化的变量组成。
构建 P 样条模型时GEKKO
,我需要检查变量值位于哪个结之间。我尝试同时使用m.if2
and m.if3
为了达成这个;然而,这两个逻辑函数都会创建许多额外的二进制切换变量,特别是对于具有许多块的样条线。最后,我得到了数以万计的二进制切换变量。这些数量超过了方程,导致自由度数小于 0。
Question: 我怎样才能避免使用m.if2
or m.if3
构建我的样条曲线?
Note: 我知道GEKKO
有预先构建的对象m.bspline
;但是,它似乎只能执行具有两个自变量的 2D B 样条曲线,而我的样条曲线可以具有十多个自变量。
The m.if2()
函数使用 MPCC 而不是二进制变量。当创建额外的松弛变量和方程时m.if2()
使用函数。这m.if2()
函数在数值上可能不可靠。这m.if3()
函数通常更可靠,但它需要额外的二进制变量和 MINLP 求解器 (APOPT) 来找到解决方案。Negative degrees of freedom
是一个警告,但仍可能求解,因为求解时不平等约束可能不活跃。
另外需要考虑的一件事是spline(coeffs, knots, vars)[i]
在解决方案期间不会重新评估。 Gekko 模型被编译为字节码,并且没有回调到原始函数。由于样条线在模型初始化期间评估一次,因此可以在求解之前或之后确定位置吗?
最后的建议是使用机器学习模型 https://apmonitor.com/pds/index.php/Main/RegressionOverview例如神经网络、高斯过程、支持向量回归器或可以导入到 Gekko 中的类似形式机器学习功能 https://gekko.readthedocs.io/en/latest/ml.html在使用 sklearn 或 tensorflow / keras 进行训练之后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)