所属体系: 监测分析原子技能集 (5/5) 引擎路径:
../监测数据分析/engine/hst_model.py核心算法: HST δ = δ_H(H~H⁴) + δ_T(sin/cos) + δ_θ(θ+lnθ)
执行铁律(强制)
违反任一条即视为技能调用失败。禁止以"结果看起来合理"为由绕过。
- 强制调用中央引擎:本技能算法实现唯一来源为
../监测数据分析/engine/hst_model.py,必须调用run_hst。执行前先引导路径,二选一:- 以
E:\Desktop\临时工作测试文件\Z\监测数据分析为工作目录,直接from engine.hst_model import run_hst;或 - 在脚本/会话开头
import sys, os; sys.path.insert(0, os.path.abspath("../监测数据分析"))后导入。
- 以
- 配置版本校验(C-002):调用
run_hst前,传入的config字典必须含schema_version字段(当前版本"2.0");缺失或类型不匹配则立即中止调用,不得静默使用默认参数或跳过校验继续拟合。 - 禁止自行编写算法(C-003):不得用 numpy/scipy 手写最小二乘、逐步回归、谐波拟合、差分回归等替代引擎函数;不得复制引擎源码到本技能目录另建副本。
- 禁止脱引擎直算:不得在会话中逐行重算 HST 分量(水压/温度/时效)后伪造
engine输出。 - import 失败即停:按第 1 条引导后仍无法
import engine.hst_model时,明确报错"引擎不可用,无法执行 HST 拟合",禁止另起炉灶自写算法顶替。 - 结果以引擎输出为准:
status/r2/component_ratios/monitor等字段是最终判读依据,禁止凭直觉改写数值;输出结构以本文件"输出契约"为准,禁止自行增删字段。
功能
对清洁的监测时间序列建立 HST 统计回归模型,实现三分量分解,输出模型品质指标和残差序列。
支持 7 种模型结构:标准 HST、温度为主 HT、水位为主 HST-H、仅时效、土石坝滞后模型、逐步回归、较佳时效模型(指数衰减 + 年/半年谐波,式3.2.17)
理论依据与因子选择(吴中如 HST 体系)
依据:吴中如《水工建筑物安全监控理论及其应用》第3章(位移分解/三分量因子)、第9章(监控指标)。完整推导与实例见知识库
02_变形和应力统计模型.md、06_关键公式速查.md。
位移分解与模型通式
$$\delta(H, T, \theta) = \delta_H + \delta_T + \delta_\theta ; (+\delta_J)$$
| 分量 | 通式 | 因子选择要点(按坝型) | |------|------|------------------------| | 水压 δ_H | $\delta_H = \sum_{i=1}^{3(4)} a_i H^i$ | 重力坝 H³;拱坝/连拱坝 H⁴(⁵)(分配荷载非线性);重力坝可附加扬压力因子 $a\Delta\bar{H}j$(观测日水位与前 j 天平均水位差)与 $a_b(\Delta\bar{H}j)^2$;泥沙压力并入时效因子 | | 温度 δ_T | $\sum b_j T_j$ 或谐波 | 有坝内温度计:各计测值 $T_j$ 或等效温度 $(\bar{T},\beta)$(因子减半);只有气温水温:前 i 天均值(重力坝 i=5/20/60/90,连拱坝 i=1/2/3);只有气温:年/半年谐波 $\sum{i=1}^{2}(b{1i}\sin\frac{2\pi it}{365}+b_{2i}\cos\frac{2\pi it}{365})$ | | 时效 δ_θ | $c_1\theta + c_2\ln\theta$ | 蓄水初期/高精度:较佳模型 $\delta_\theta = C[1-e^{-r\theta}] + \sum_{n=1}^{2}(K_n\sin\frac{2\pi nt}{365}+K'_n\cos\frac{2\pi nt}{365})$(指数衰减 + 可恢复徐变谐波,Gauss-Newton 拟合);运行多年后可分段线性 | | 裂缝 δ_J | $\sum d_j J_j$ | 下游面水平缝等有规律裂缝:测缝计开合度 $J_j$ 为因子 |
因子相关警示(第一性难题)
- H、H²、H³ 之间简单相关系数 r > 0.9;水温因子 $H^i$ 与水压因子形式相同 → 分量不唯一;
- 标准回归系数/偏回归平方和在因子相关时不能单独表征贡献 → 必须用逐步回归筛选(引入/剔除 F 阈值一般取 2~4,容许值 T = 0.0001~0.001);
- 样本数 / 因子数建议 5~10 倍;建模建议扣除初始状态(H₀, T₀, θ₀)使常数项 ≈ 0 且有物理意义;
- 当水位-温度年周期强相关时,可先用差值回归(等水位两两相减消水压)分离温度/时效,再回归水位项——已实现为
engine.hst_model.difference_regression()(显式含 ΔH 项吸收残余水压差 + Lasso 稀疏化;差值误差可达常规回归 2 倍,用于辅助分离判断而非精确估计)。
监控指标联动(第9章,评估输出的物理锚点)
- 置信区间法:模型预测值 ± t·S(α=1%~5%),残差超限且无趋势 → 异常;
- 一级监控指标(警戒值) = 安全系数法(允许抗力)反推荷载 → 模型计算效应量;二级监控指标(极值) = 极限状态法(极限抗力)反推;
- 表达式统一形式:$\delta_m = \text{水压项} + \text{温度项} + \text{时效项}$,按时段(汛期/非汛期)分别标定;
- 实测 > 二级极值 = 异常/险情;时效分量突变/急剧变化 = 大坝或地基"病态"征兆。
触发关键词
HST、HST模型、回归分析、统计模型、三分量分离、水压温度时效、模型拟合、变形分解、渗流分解、run_hst
输入契约
{
"design_id": str, # 测点编号
"time_series": list[str], # 时间标签 ["2024-01", "2024-02", …]
"value_series": list[float], # 测值(已清洁)
"water_level": list[float], # 同步水位序列(可选,用于水压分量)
"temperature": list[float], # 同步温度序列(可选,用于温度分量)
"dam_type": str, # 工程类型: "concrete_gravity"(默认) | "concrete_arch" |
# "earth_rockfill" | "foundation_pit" | "slope" | "tunnel"
"do_stepwise": bool, # 是否自动逐步回归(默认 True)
}
输出契约
{
"status": str, # "ok" | "error"
"design_id": str,
"n": int, # 有效样本数
"r2": float, # 决定系数(0~1,≥0.85 良好)
"r2_adj": float, # 调整后 R²
"rmse": float, # 均方根误差
"f_stat": float, "f_pvalue": float, # F 检验
"aic": float, "bic": float, # 信息准则
"k": int, # 入选因子数
"dw": float, # Durbin-Watson 统计量(≈2 为无自相关)
"vif_max": float, # 最大 VIF(>10 共线性严重)
"bp_pvalue": float, # Breusch-Pagan 异方差检验 p 值
"component_ratios": { # 三分量贡献率(基于方差分解)
"hydrostatic": float, # 水压分量占比 %
"temperature": float, # 温度分量占比 %
"time_effect": float # 时效分量占比 %
},
"coefficients": dict, # 回归系数
"fitted": list[float], # 拟合值
"residuals": list[float], # 残差(观测−拟合)
"equation": str, # 模型表达式文本
"monitor": dict, # 监控指标(残差标准差 S / ±1.96S·±3S 带 / 超限点数 / 时效趋势)
"aging_model_used": str # 实际采用的时效模型
}
执行方法
from engine.hst_model import run_hst
result = run_hst(
design_id="IN-01",
time_series=["2024-01", …, "2024-12"],
value_series=[10.2, …, 12.8],
water_level=[…], # 可选
temperature=[…], # 可选
dam_type="concrete_gravity",
)
print(result.status, result.r2, result.component_ratios)
JSON 序列化
# 转换为 dict / JSON
d = result.to_dict()
# {"r2": 0.952, "dw": 1.87, "component_ratios": {...}, …}
j = result.to_json()
# JSON 字符串
# 长序列截断选项(控制输出大小)
d_trimmed = result.to_dict(trim_series=True)
示例
输出片段:
{
"status": "ok",
"design_id": "IN-01",
"n": 120,
"r2": 0.952,
"dw": 1.87,
"f_pvalue": 0.0001,
"component_ratios": {
"hydrostatic": 45.2,
"temperature": 32.1,
"time_effect": 22.7
},
"equation": "δ = 0.312·H - 0.018·H² + ... + 1.24·sin(2πt/365) + ... + 2.15·θ + 1.03·ln(θ)"
}
状态语义与诊断
| 字段 | 判读 | 处理建议 |
|------|------|---------|
| status="error" | 拟合失败(样本<5 等) | 补充数据或跳过 |
| r2<0.7 | 拟合差 | 检查数据质量或改用非线性模型 |
| dw 远离 2 | 残差自相关 | 考虑 ARMA 残差校正 |
| vif_max>10 | 共线性严重 | 启用 do_stepwise 逐步回归筛选 |
| monitor.n_exceed_level1>0 | 超一级统计警戒(±1.96S) | 关注该测点 |
| monitor.aging_trend | 时效分量突变/急剧变化 | 大坝/地基"病态"征兆,重点排查 |
Description
[auto-generated placeholder]
Usage
[auto-generated placeholder]
Trigger
[auto-generated placeholder]
Example
[auto-generated placeholder]
微信扫一扫