返回列表

#2 Solution: The inverse of a PID controller

462. Google Brain - Ventilator Pressure Prediction | ventilator-pressure-prediction

开始: 2021-09-22 结束: 2021-11-03 临床决策支持 数据算法赛
#2 解决方案:PID控制器的逆运算

#2 解决方案:PID控制器的逆运算

作者:AmbrosM (Grandmaster) | 发布日期:2021-11-04

“这是一个多么奇怪的数据集啊!” 当我看到预测压力的初步尝试时,我是这么想的:为什么 lag_back 特征——也就是未来的阀门设置——有助于预测压力?为什么人们使用双向 LSTM 而不是单向的?如果 u_in 是一个独立变量,为什么最后一个 u_in 有助于预测三秒前测量的第一个压力值?

在开始数据处理之前,我们需要一个符合因果关系的定性模型:

  1. 在物理系统中,压力是过去阀门设置的函数:p[i] = f(u_in[:i])
  2. u_in 不是一个独立变量。u_in 是数字控制器的输出,而控制器的输入是过去测量的压力:u_in[i] = g(p[:i+1])
  3. 根据论文,实验者使用了具有各种参数设置的 PID 控制器和神经网络来控制 u_in,并且他们引入了随机探索性扰动。
  4. 实验是分批运行的,一次呼吸的初始压力 p[0] 由上一次呼吸的阀门设置决定。虽然数据集中的呼吸顺序已经被打乱,但神经网络学会了从 u_in 值中近似识别批次,从而可以预测 p[0]

看着这个定性模型,我意识到我需要 PID 控制器的逆函数来基于 u_in 预测压力,即一个以 u_in 为输入并确定控制器看到了什么压力才会输出这个 u_in 的函数。

我将首先解释寻找 P 控制器逆函数的简单情况,然后继续讲解 PI 控制器。

P 控制器的逆运算

对于 P 控制器,用户选择一个目标压力(p_star),然后控制器重复将阀门设置为测量压力与目标压力之差,并乘以一个系数 p_coef。测量压力越低,控制器打开阀门的开度越大:

def p_controller(p_coef, p_star):
    for i in range(80):
        u_in[i] = clip(p_coef * (p_star - p[i]), 0, 100)

我们识别出 P 控制器的图表特征,即 u_inp 的缩放镜像:

634
1300
3193

对于训练数据,u_in 和压力都是已知的,我们可以通过线性回归确定 p_coefp_star。如果线性回归拟合良好,我们就找到了一个 P 控制器;如果不拟合,则实验使用的是其他控制器。对训练数据的所有呼吸运行线性回归,我们找到了用于 p_coefp_star 的值:

  • p_coef 是 [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中的一个元素(p_coef 可能为 0,但这种情况无用)。
  • p_star 是 [10, 15, 20, 25, 30, 35] 中的一个元素。

对于测试数据,只有 u_in 已知,而三个变量未知(p_coefp_star 和压力),我们该怎么办?这里的关键观察结果是,压力传感器总是给出 950 个离散压力测量值之一,而 P 控制器是一个数字计算机,其计算(几乎)是精确的。因此,我们使用以下算法找到 p_coefp_star