实时传感器数据归一化方案求助:无全局最值时的实现方法
实时传感器数据归一化可行方案
1. 动态维护最值
累计更新全局最值
维护两个变量实时记录已接收数据的最小/最大值,每收到新数据就更新,直接代入归一化公式:
current_min = float('inf') current_max = -float('inf') def normalize_cumulative(new_data): global current_min, current_max current_min = min(current_min, new_data) current_max = max(current_max, new_data) if current_max == current_min: return 0.0 # 避免除以0 return (new_data - current_min) / (current_max - current_min)
缺点是如果后续出现超出历史范围的数据,之前归一化的结果无法回溯修正,适合对历史数据一致性要求不高的场景。
滑动窗口最值
只保留最近N个数据,计算窗口内的最值进行归一化,适配数据分布的近期变化:
from collections import deque window = deque(maxlen=1000) # 窗口大小可根据需求调整 def normalize_window(new_data): window.append(new_data) win_min = min(window) win_max = max(window) if win_max == win_min: return 0.0 return (new_data - win_min) / (win_max - win_min)
2. 基于传感器标称量程归一化
如果传感器有明确的输出范围(比如官方标注0-5V对应0-100℃),直接用固定量程最值计算:
# 替换为传感器实际的量程边界 SENSOR_MIN = 0 SENSOR_MAX = 100 def normalize_fixed_range(new_data): if SENSOR_MAX == SENSOR_MIN: return 0.0 return (new_data - SENSOR_MIN) / (SENSOR_MAX - SENSOR_MIN)
这个方案最稳定,完全不依赖历史数据,前提是你清楚传感器的输出边界。
3. 自适应Z-score归一化
如果不需要映射到[0,1]区间,而是关注数据相对分布,可以动态更新均值和方差,做Z-score归一化:
count = 0 mean = 0.0 m2 = 0.0 # 用于计算方差的中间变量 def normalize_zscore(new_data): global count, mean, m2 count += 1 delta = new_data - mean mean += delta / count delta2 = new_data - mean m2 += delta * delta2 if count < 2: return 0.0 variance = m2 / (count - 1) std_dev = variance ** 0.5 if std_dev == 0: return 0.0 return (new_data - mean) / std_dev
4. 指数加权滑动最值
给近期数据更高权重,平滑过渡数据范围的变化,避免单次极端值拉偏结果:
alpha = 0.1 # 权重系数,越接近1越偏向新数据 ewma_min = None ewma_max = None def normalize_ewm(new_data): global ewma_min, ewma_max if ewma_min is None: ewma_min = new_data ewma_max = new_data else: ewma_min = alpha * new_data + (1 - alpha) * ewma_min ewma_max = alpha * new_data + (1 - alpha) * ewma_max if ewma_max == ewma_min: return 0.0 return (new_data - ewma_min) / (ewma_max - ewma_min)
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

