3. 环境荷载与结构响应基线关系建模
为什么需要环境荷载—响应基线
海洋平台长期处于风、浪、潮的联合作用下,结构响应(如关键测点应变、加速度均方根、倾角)中同时叠加了环境效应与结构状态效应。健康指数要反映结构本身的变化,就必须先把"今天风浪大所以响应大"这部分正常波动剔除掉。基线回归模型的作用就是给出:在给定环境条件下,结构响应"本应"是多少。残差 = 实测响应 − 基线预测,残差才是后续健康指数真正关心的量。
本例使用某导管架平台 12 个月的小时级监测数据(示例数据,含风速 V、有效波高 Hs、谱峰周期 Tp、潮位 Tide 与关键测点应变均方根 SR),比较三种回归形式的拟合与泛化能力:线性多元回归、含二次项的响应面回归、以及梯度提升树回归。
数据准备与建模口径
建模前先固定口径,避免后续比较失真:
- 样本:清洗后的小时级记录,剔除停机与传感器故障时段,保留
V, Hs, Tp, Tide与SR均有效的样本。 - 划分:按时间顺序切分,前 9 个月训练、后 3 个月测试。时间序列不能随机打乱,否则会因相邻样本高度相关而高估泛化能力。
- 标准化:对输入做 z-score 标准化,仅用训练集统计量,测试集复用同一组均值与标准差。
- 评价:训练集 R²、RMSE 反映拟合;测试集 RMSE 反映泛化;另看残差与
Hs的关系是否残留趋势。
三种回归形式的实现
下面代码自洽可运行,使用 numpy 与 scikit-learn,示例数据由固定随机种子生成,便于复现比较逻辑(真实工程中替换为实际监测数据即可)。
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import r2_score, mean_squared_error
rng = np.random.default_rng(42)
n = 8760 # 一年小时级样本
V = rng.gamma(2.0, 4.0, n) # 风速 m/s
Hs = 0.02 * V**1.6 + rng.normal(0, 0.15, n) # 波高与风速相关
Hs = np.clip(Hs, 0.1, None)
Tp = 3.5 + 1.2 * np.sqrt(Hs) + rng.normal(0, 0.4, n)
Tide = 1.5 * np.sin(2*np.pi*np.arange(n)/12.42) + rng.normal(0, 0.1, n)
# 真实响应:含二次项与交互项,并叠加噪声
SR = (2.0 + 0.8*V + 3.5*Hs + 0.4*Tp + 0.6*Tide
+ 0.05*V*Hs + 0.9*Hs**2 + rng.normal(0, 0.6, n))
X = np.column_stack([V, Hs, Tp, Tide])
split = int(n * 0.75)
Xtr, Xte, ytr, yte = X[:split], X[split:], SR[:split], SR[split:]
models = {
"M1 线性": make_pipeline(StandardScaler(), LinearRegression()),
"M2 二次响应面": make_pipeline(
StandardScaler(),
PolynomialFeatures(degree=2, include_bias=False),
LinearRegression()),
"M3 提升树": GradientBoostingRegressor(
n_estimators=300, max_depth=3, learning_rate=0.05,
subsample=0.8, random_state=0),
}
for name, m in models.items():
m.fit(Xtr, ytr)
p_tr, p_te = m.predict(Xtr), m.predict(Xte)
print(f"{name:12s} 训练R2={r2_score(ytr,p_tr):.3f} "
f"训练RMSE={mean_squared_error(ytr,p_tr)**0.5:.3f} "
f"测试RMSE={mean_squared_error(yte,p_te)**0.5:.3f}")
运行后应观察到:M1 训练 R² 明显偏低且测试 RMSE 最大;M2 训练与测试 RMSE 都较低且差距小;M3 训练 R² 最高,但测试 RMSE 通常略高于 M2。这正是"拟合能力"与"泛化能力"分离的典型表现——树模型容易记住训练集细节,而本例真实响应本身接近二次结构,响应面模型更贴合。
残差诊断:判断基线是否可用
仅看 RMSE 不够,还要检查残差是否还残留环境依赖。把测试集残差 r = yte − p_te 对 Hs 分箱求均值:若各箱均值接近 0 且无单调或弯曲趋势,说明环境效应已被充分吸收;若残差随 Hs 增大而系统性偏移,说明模型形式不足,应升级到二次项或加入交互项。
Hs 增大而增大(异方差),可考虑对 SR 取对数或改用加权最小二乘,否则健康指数在大浪工况下会被噪声放大。交付:基线模型配置与验收表
| 项目 | 设定/判据 | 本例取值 |
|---|---|---|
| 输入变量 | 环境荷载 | V, Hs, Tp, Tide |
| 输出变量 | 关键响应 | SR(应变均方根) |
| 训练/测试划分 | 按时间顺序 | 前 75% / 后 25% |
| 推荐模型 | 测试 RMSE 最低且残差无结构 | M2 二次响应面 |
| 验收阈值 | 测试 RMSE 相对 M1 降低 ≥ 20% | 示例中满足 |
| 残差检查 | 分箱均值 |mean| < 0.2σ | 需在实测数据上复核 |
| 输出 | 健康指数输入 | 残差序列 r(t) |
最终交付物是训练好的基线模型(含标准化参数与多项式特征配置)与残差序列 r(t)。后续健康指数构建直接以 r(t) 为输入,环境波动已被剔除,指数变化才真正指向结构状态。