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

Python信号峰值识别:重量数据分段峰值通用算法问询

针对重量数据时段分界点识别的解决方案

核心思路

你的需求本质是检测信号的阶跃变化点——也就是从重量X到Y的突变位置,而非单纯找峰值,这可能是之前用scipy.find_peaks效果不稳定的核心原因。

推荐方法及实现要点

1. 平滑信号+自适应差分阈值法

  • 基于你已有的批量平均滤波结果(橙线),计算一阶差分:差分操作能直接放大信号的突变处,滤除平稳段的小波动;
  • 用数据自身统计量设定阈值:不用固定数值,取差分序列的95分位数(可根据噪声程度调整分位值),超过该阈值的位置即为候选分界点;
  • 后处理去噪:如果存在连续多个超过阈值的点,取该连续段的中间点或起始点作为最终分界点,避免噪声误判。

示例代码片段:

import numpy as np
from scipy.ndimage import uniform_filter1d

# 假设filtered_signal是批量平均后的橙线数据
# 可选:进一步平滑以削弱残留噪声
smoothed = uniform_filter1d(filtered_signal, size=5)
# 计算差分并取绝对值
diff = np.abs(np.diff(smoothed))
# 用95分位数作为自适应阈值
threshold = np.percentile(diff, 95)
# 筛选候选点
candidates = np.where(diff > threshold)[0]
# 合并连续候选点,取中心位置作为分界点
if len(candidates) > 0:
    clusters = np.split(candidates, np.where(np.diff(candidates) > 1)[0] + 1)
    split_point = clusters[0][len(clusters[0]) // 2]

2. 双滑动窗口统计法

  • 设定两个相邻的滑动窗口,分别计算窗口内信号的均值/中位数;
  • 当两个窗口的统计量差值超过设定比例(比如超过基准重量X的5%)时,判定当前位置为分界点;
  • 窗口大小可根据采样频率调整,比如对应1-2秒的采样点数,确保能覆盖噪声波动但不掩盖阶跃变化。

3. 异常点检测算法(适配复杂波动场景)

  • 如果数据噪声大、时段变化规律多样,可以用孤立森林检测突变点:阶跃位置属于信号中的异常值,孤立森林能自动识别这类偏离整体分布的点;
  • 无需大量标注,仅需输入平滑后的信号即可完成检测,适配不同数据集的波动特性。

避坑提示

  • 放弃峰值检测思维:你的分界点是阶跃变化,不是峰值,scipy.find_peaks的height、distance等参数天然不适合这类场景,强行调整只会增加适配成本;
  • 滤波适度:过度平滑会抹平阶跃变化,批量平均的窗口大小建议控制在能覆盖3-5个噪声点的范围;
  • 拒绝固定阈值:用数据自身的统计量(分位数、标准差倍数)设定阈值,是适配不同数据集的关键。

内容的提问来源于stack exchange,提问作者Zee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:15:37