【发布时间】:2021-07-01 07:59:56
【问题描述】:
考虑一个涉及 MV、m.Var、m.CV 和 m.Param 矩阵的 gekko 方程,其中包括基于非线性回归的最大化问题。
如何在当前代码中添加一个与时间相关的决策变量“covar”,这样:
covar(在时间 t)= [1,gekko_attr1 ** attr1_pow,gekko_attr2 ** attr2_pow,gekko_attr3 ** attr3_pow] * covar(在时间 t-1)* 转置([1,gekko_attr1 ** attr1_pow,gekko_attr2 * * attr2_pow, gekko_attr3 ** attr3_pow]) + 常量
数据集:
https://drive.google.com/file/d/10tVHghTvRThsDfyzprINdlVTtJTUbSyQ/view?usp=sharing
def gekko_fun():
xm1 = np.array(data['Attr1'])
xm2 = np.array(data['Attr2'])
xm3 = np.array(data['Attr3'])
ym = np.array(data['Result'])
m = GEKKO(remote=False)
# parameters
gekko_attr1 = m.Param(value = xm1)
gekko_attr2 = m.Param(value = xm2)
gekko_attr3 = m.Param(value = xm3)
intercept = m.MV(lb=0, name="Intercept")
attr1_multiplier = m.MV(lb=0)
attr2_multiplier = m.MV(lb=0)
attr3_multiplier = m.MV(lb=0)
intercept_lambda = m.MV(lb=0, ub = 1)
attr1_lambda = m.MV(lb=0, ub = 1)
attr2_lambda = m.MV(lb=0, ub = 1)
attr3_lambda = m.MV(lb=0, ub = 1)
attr1_pow = m.MV(lb=0, ub=1)
attr2_pow = m.MV(lb=0, ub=1)
attr3_pow = m.MV(lb=0, ub=1)
intercept.STATUS = 1
attr1_multiplier.STATUS = 1
attr2_multiplier.STATUS = 1
attr3_multiplier.STATUS = 1
intercept_lambda.STATUS = 1
attr1_lambda.STATUS = 1
attr2_lambda.STATUS = 1
attr3_lambda.STATUS = 1
attr1_lambda_pow.STATUS = 1
attr2_lambda_pow.STATUS = 1
attr3_lambda_pow.STATUS = 1
control_value = m.CV(value=ym)
control_value.STATUS=1
pred_value = m.Var
error = m.Var
maximized_value = m.Var
m.options.IMODE = 2
m.options.MAX_ITER = 999
m.Equation(pred_value == (
np.dot(
[[1, gekko_attr1**attr1_pow, gekko_attr2**attr2_pow, gekko_attr3**attr3_pow]]
,#multiply
np.add(
np.dot(
[
[intercept_lambda,0,0,0],
[0,attr1_lambda,0,0],
[0,0,attr2_lambda,0],
[0,0,0,attr3_lambda]
]
,#multiply
[
[intercept],
[attr1_multiplier],
[attr2_multiplier],
[attr3_multiplier]
]
),#add
np.dot(
[
[attr1_multiplier,attr2_multiplier,attr3_multiplier],
[attr1_multiplier,0,0],
[0,attr2_multiplier,0],
[0,0,attr3_multiplier]
],#multiply
[
[gekko_attr1**attr1_pow],
[gekko_attr2**attr2_pow],
[gekko_attr3**attr3_pow]
]
)
)
)
))
m.Equation(error==control_value-pred_value)
m.Equation(maximized_value == -m.log(covar) - covar*(error)**2)
m.Maximize(maximized_value)
我是 gekko 的新手,如果我能在解决这个问题上得到一些帮助,我将不胜感激。 感谢您的宝贵时间。
【问题讨论】:
标签: python optimization regression nonlinear-optimization gekko