我想使用共享独立变量的两个方程,最小化两个不同大小数据集中测量的y和预测的y之间的差异.我正在使用gekko作为我的求解器.

当我的两个数据集的行数不同时,我得到异常错误Data arrays must have the same length, and match time discretization in dynamic problems.然而,即使我将行数设置为相等,也会得到错误duplicate variable declarations.因此,这让我相信,我的优化问题在求解两个共享自变量的方程时定义不清.

变量:v1, v2

参数(ds=数据集):

ds1_p1, ds1_p2 
ds2_p1, ds2_p2, ds2_p3

方程:

y1 = v1 * ds1_p1 + v2 * ds1_p2
y2 = v1 * v2 * ds2_p1 + v1 * ds2_p2 + v2 * ds2_p3

减少:

((y1_pred - y1_meas) / y1_meas)^2 
((y2_pred - y2_meas) / y2_meas)^2

下面显示了这个双方程示例的简化代码(我的实际代码有更多的方程、变量和参数):

# define GEKKO model
m = GEKKO()
# variables and parameters
variables = {"v1": {"val": 1, "lb": 0, "ub": 2}, "v2": {"val": 3, "lb": 1, "ub": 5}}

# create variable dictionary
v_dic = {
    var_name: m.FV(
        value=var_val["val"],
        lb=var_val["lb"],
        ub=var_val["ub"],
        name=var_name,
    )
    for var_name, var_val in variables.items()
}

# set variables to be available for optimizer
for var in v_dic.values():
    var.STATUS = 1

parameters = {
    "dataset1": {f"p{i}": np.random.random(50) for i in range(1, 3)},
    "dataset2": {f"p{i}": np.random.random(100) for i in range(1, 4)},
}

# create parameters dictionary
p_dic = {
    ds_name: {
        par_name: m.Param(value=par_val, name=par_name)
        for par_name, par_val in ds_val.items()
    }
    for ds_name, ds_val in parameters.items()
}

# v1 = 2, v2 = 4
ym = {
    "dataset1": {"ymeas": 2 * p_dic["dataset1"]["p1"] + 4 * p_dic["dataset1"]["p2"]},
    "dataset2": {"ymeas": 2 * 4 * p_dic["dataset2"]["p1"] + 2 * p_dic["dataset2"]["p2"] + 4 * p_dic["dataset2"]["p3"]},
}

# create y measured dictionary
ym_dic = {
    ds_name: m.Param(value=ds_val["ymeas"], name=f"ymeas_{ds_name}")
    for ds_name, ds_val in ym.items()
}

# create y predicted dictionary
yp_dic = {ds_name: m.Var() for ds_name in ym_dic.keys()}

# define the equation for each dataset
m.Equation(
    yp_dic["dataset1"]
    == v_dic["v1"] * p_dic["dataset1"]["p1"] + v_dic["v2"] * p_dic["dataset1"]["p2"]
)

m.Equation(
yp_dic["dataset2"] == v_dic["v1"] * v_dic["v2"] * p_dic["dataset2"]["p1"] + v_dic["v1"] * p_dic["dataset2"]["p2"] + v_dic["v2"] * p_dic["dataset2"]["p3"]
)

# minimize each equation
for d_s in yp_dic.keys():
    m.Minimize(((yp_dic[d_s] - ym_dic[d_s]) / ym_dic[d_s]) ** 2)

m.options.IMODE = 2  # regression mode

m.solve()

# print solution
print("Solution")
for name, var in v_dic.items():
    print(f"{name} == {var.value[0]}")

推荐答案

IMODE=2适用于模型方程编写一次并为每行数据复制的问题.使用IMODE=3并使用列表理解或循环 for each 数据集建立单独的方程.

from gekko import GEKKO
m = GEKKO()
x = [1,2,3,4,5]
y = [1,2,3,4,5,6,7]
a = m.FV(); a.STATUS=1
z = [2,4,6,8,10,12,14]

[m.Minimize((z[i]-a*x[i])**2) for i in range(len(x))]
[m.Minimize((z[i]-a*y[i])**2) for i in range(len(y))]

m.options.IMODE=3
m.solve(disp=False)

print(a.value[0])

公共参数解为a=2.0xy的数据长度不同.

Python相关问答推荐

决策树分类器的基础sklearn熵和log_loss标准是否有差异?

Python-Polars:如何用两个值的平均值填充NA?

想要使用Polars groupby_Dynamic来缩减时间序列收件箱(包括空垃圾箱)

自定义新元未更新参数

替换字符串中的点/逗号,以便可以将其转换为浮动

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

机器人与Pyton Minecraft服务器状态不和

如何防止Plotly在输出到PDF时减少行中的点数?

Python中的函数中是否有充分的理由接受float而不接受int?

有症状地 destruct 了Python中的regex?

如何让Flask 中的请求标签发挥作用

Pandas:将多级列名改为一级

Python—从np.array中 Select 复杂的列子集

mypy无法推断类型参数.List和Iterable的区别

删除marplotlib条形图上的底边

Python列表不会在条件while循环中正确随机化'

计算天数

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

在Python中计算连续天数

OpenCV轮廓.很难找到给定图像的所需轮廓