如何在Gekko ARX模型中剔除无效数据用于线性模型辨识?
Gekko ARX建模中剔除无效数据的方法
在Gekko中没有内置的可视化“标记无效段”工具,但可以通过数据预处理实现和商业软件类似的无效数据剔除功能,以下是几种实用方案:
1. 直接截取有效时间区间
若已知无效数据的时间范围,直接从原始数据中提取有效时间段的子集:
import pandas as pd from gekko import GEKKO # 读取阶跃测试数据 data = pd.read_csv('step_test_data.csv') # 提取时间戳100到500之间的有效数据 valid_data = data[(data['timestamp'] >= 100) & (data['timestamp'] <= 500)] # 分离输入、输出变量用于ARX建模 u = valid_data['process_input'].values y = valid_data['process_output'].values
2. 用掩码数组过滤异常值
针对装置跳车、异常波动等导致的无效数据,可通过布尔掩码标记有效数据:
import numpy as np # 定义输出变量的合理范围(例如0~100) y_min, y_max = 0, 100 # 标记有效数据:输出在合理范围且无突变(一阶差分小于阈值) valid_mask = (y >= y_min) & (y <= y_max) & (np.abs(np.diff(y, prepend=y[0])) < 10) # 过滤得到有效输入输出数据 u_valid = u[valid_mask] y_valid = y[valid_mask]
3. 跳过分散的无效区间
若无效数据是多个分散区间,可批量标记并过滤:
# 定义多个无效时间区间 invalid_intervals = [(200,250), (350,400)] # 初始化全量有效索引 valid_indices = np.ones(len(data), dtype=bool) for start, end in invalid_intervals: # 标记无效区间内的数据 invalid_mask = (data['timestamp'] >= start) & (data['timestamp'] <= end) valid_indices[invalid_mask] = False # 提取有效数据 u_valid = data['process_input'].values[valid_indices] y_valid = data['process_output'].values[valid_indices]
4. 建模时通过权重忽略无效数据
若不想提前过滤数据,可在ARX建模时给无效数据赋予0权重,让模型训练时自动忽略这些点:
m = GEKKO(remote=False) # 定义ARX模型阶数(p为输入阶数,q为输出阶数) m.arx(p=[2,2], q=[2]) # 加载全量数据 m.time = data['timestamp'].values u_gekko = m.Param(value=data['process_input'].values) y_gekko = m.CV(value=data['process_output'].values) # 创建权重数组,无效区间内的点权重设为0 weights = np.ones(len(data)) weights[(data['timestamp'] >= 200) & (data['timestamp'] <=250)] = 0 y_gekko.WSP = weights # 给CV变量设置权重 # 训练模型 m.options.IMODE = 2 m.solve(disp=False)
以上方法可灵活适配不同类型的无效数据场景,确保ARX模型仅基于有效阶跃测试数据完成辨识。
内容的提问来源于stack exchange,提问作者Prof Kevin Brooks
相关产品推荐
相关产品推荐

