算法说明.md 3.9 KB

5 号机缸体振动标签算法说明

1. 输入

  • wave_file 中 5 号机 6 个缸体振动点位;
  • 每个文件读取 wave_sample_one 的首周期;
  • 仅保留 rpm > 0 的运行态文件;
  • 约 15 分钟一个文件;
  • 每个文件约 1544 个采样点、采样率 25.6 kHz、约 60ms。

2. 首周期特征

每个文件、每个缸计算:

  • 时域:RMS、峰值、峰峰值、偏度、峭度、峰值因子、脉冲因子、裕度因子、波形因子、过零率;
  • 频域:频带能量、谱重心、谱熵、高频能量占比;
  • 包络:包络 RMS/峰值、1x/2x/3x 包络幅值、包络熵;
  • 跨缸残差:同缸 vs 同级其他缸的 rms_log、kurt、hf_ratio、env_1x_log、env_2x_log。

当前评分主要使用跨缸残差特征,避免全厂共同工况变化直接变成单缸标签。

3. 动态局部基线

对每个 15 分钟点、每个缸:

  • 向前查看最多 30 天;
  • 至少需要 96 个有效运行点(1 天);
  • 自动跳过停机和无数据区间;
  • 每次断档超过 2 小时后,新启动的前 1 小时不参与基线;
  • 基线位置使用中位数,尺度使用 (Q75-Q25)/1.349;
  • 局部基线不足 1 天时标记 baseline_ok=False,不直接确认标签。

与旧版全局基线相比,动态基线能避免把“全时段平均”当成近期正常状态。

4. 评分和等级

对每个残差特征计算局部 z-score:

z = (feature - local_median) / local_scale

分数取各残差特征 z-score 绝对值的最大值;最大贡献特征作为 driver。

等级阈值只由局部基线和稳健尺度决定:

轻微      = max(3.5, 中位数 + 6 × MAD)
异常      = max(5.0, 中位数 + 10 × MAD)
严重异常  = max(7.0, 中位数 + 14 × MAD)
  • 分数达到“轻微”才作为候选;
  • 等级由段内最大分数决定;
  • 不使用事件日期修改阈值;
  • 不使用 24 小时局部对比度门槛。

5. 15 分钟段

  • 点级命中后,按数据连续性聚成段;
  • 单点强异常允许保留;
  • 段属性包括起止、时长、最大分数、最大时间、driver、方向、等级、特异性;
  • 方向:
    • 高幅高冲击:RMS 和峭度都高于同级;
    • 低幅高冲击:RMS 不高,但峭度高于同级;
    • 高幅:只有 RMS 高;
    • 未确认:单特征或证据不足。

6. 小时标签

  • 每小时最多 4 个 15 分钟点;
  • 至少 2 个点落入异常段,该小时才形成标签;
  • 相邻小时且连续时合并;
  • 中间缺 1 小时不跨段合并;
  • 小时标签继承段的等级、方向、确认状态和最大分数。

7. 状态标记,不做二次删除

不再用单独规则删除标签。以下信息只写入 review_flags / 字段:

  • 未确认:多特征确认不足;
  • 低幅高冲击:RMS 不高但峭度高;
  • 高幅:只有幅值高;
  • 启动/过渡:启动后前 1 小时占比高;
  • 局部基线不足:前置 1 天基线不足;
  • 持续证据弱:段内活跃点比例低。

所有标签都保留,HTML 通过筛选查看。

8. 事件验证

事件只用于验证,不参与标签生成:

事件 缸 当前结果 等级 提前量
2026-06-12 二缸 6/11 11:00~15:45 严重异常 0.54 天
2026-06-21 五缸 6/18 09:45~11:15 轻微 2.59 天
2026-07-11 二缸 7/05 01:15~03:00 轻微 5.95 天

当前 3/3 事件有振动标签;6/21 是低幅高冲击,不再是漏报。

9. 已知限制

  1. 首周期是快照,无法覆盖完整 15 分钟内的所有冲击;
  2. 启动/停机瞬态可能提高峭度,需要结合 review_flags 复核;
  3. 动态基线在早期数据不足 1 天时无法判断;
  4. 6/21 的振动证据较弱,温度是主要参考;
  5. 等级是规则分级,不是物理故障严重度的绝对标定。

10. 后续合并

见 合并方案.md。当前不修改 models/。