You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:15:52