深度学习替换为具体模型名称如:自适应lstm/注意力lstm/后处理lstm
背景与任务
任务背景:
多传感器技术广泛应用于医疗健康(HC)、人体活动识别(HAR)、工业控制系统(ICS) 等领域,产生大量多变量时间序列数据(即多个传感器同时采集的、随时间变化的连续数据,如医疗中的脑电信号、活动识别中的加速度计数据)。随着物联网(IoT)、可穿戴设备、工业物联网(IIoT)的发展,多传感器技术已成为采集物理世界数据的核心手段,广泛应用于三大关键领域,且每个领域都存在强烈的异常检测需求。
机动车碰撞是 15-29 岁人群的首要死因(WHO 统计),全球每年超 5000 万人因碰撞受伤,部分导致残疾。准确预测交通异常能提前预警,降低事故风险,提升道路安全。
背景要联想到:
1. 做这个实验的基础条件(数据集、硬件)是否满足
2. 做这个是实验的必要性,有什么作用/好处
任务目标:
在有监督场景(训练数据有标注),精准识别多传感器时间序列中的异常,在这里也就是提升交通碰撞预测的准确性(AUC-PR、AUC-ROC、F1 分数、准确率)。
有监督的即训练数据有标注
无监督的即训练数据没有标注,异常检测大部分为这种(因为有监督代价太大了,得做数据标记 )
异常检测无监督的时候检测的是离群点和其他特征不太相符的点等
还有半监督,及一半数据是标注好的,让模型根据这一半去猜另一半
挑战
传统模型的不足之处:
仅关注静态特征(如 POI、历史流量),忽略事件间的动态演化交互;
未有效处理数据不平衡,难以捕捉稀有异常事件的内在模式;(最难的一点)
空间依赖建模单一,未考虑多视角(功能相似、碰撞历史、交通状况)的网格交互;
动态特征演化易出现「过平滑」,导致正常与异常事件的特征差异被掩盖。
不足之处得面向挑战来说——说一个模型不行,你为什么要用这个模型时:
1. 要说原来的模型相对于你的模型在设计上有什么不同;
2. 还要落实到他们真正的挑战上/处理的时候为什么不行。
任务的共性挑战:
数据不平衡:异常事件在时空上极度稀疏,模型易过度拟合正常事件,难以学习异常模式;
静态 - 动态特征的联合建模:静态特征(如 POI)是固定的,动态特征(如事件交互)是时变的,二者的依赖关系复杂,需设计灵活的融合机制;
多视角空间依赖捕捉:网格(也就是某个地区)间的影响不仅来自地理邻近,还来自功能相似、碰撞历史关联等,单一空间图无法全面覆盖;(另类的数据融合问题)
动态演化中的过平滑:动态特征随时间更新时,易因正常事件的累积导致异常与正常事件的特征趋同,降低模型区分度;
训练效率与时间依赖的平衡:动态演化具有强时间依赖,传统批处理(并行)会破坏时序关系,而单样本训练效率极低。
区分过平滑和过拟合
过平滑是什么?
过平滑(over-smoothing): 在 GNN 中,随着层数加深、反复邻居聚合(本质上像不断做平均),不同节点的表示会越来越相似,最终难以区分。
过拟合是什么?
过拟合: 模型在训练数据上学得过于贴合(把噪声和偶然性也当成规律),导致训练效果很好但对未见数据泛化能力差。
过平滑 vs 过拟合(最简对比)
过平滑: 表示被“抹平”了,节点之间区分度下降。
- 现象:训练集和测试集都可能表现差(因为表达能力丢了)。
过拟合: 模型把训练集噪声也记住了。
- 现象:训练好、测试差。
过平滑更多的还是指一些尖锐点因为学太多了,被模糊掉了。
层数过多,那就是过拟合了;趋于一致一般就是学太多学太泛了,没有目的性;这也是后来为啥这么喜欢用注意力机制,因为效果确实好。
所以过平滑更像“信息被平均掉,学不出差异,该学的没学到”;过拟合是“学了不该学的细节,不该学的也学了”。
模型解析
任务组成:
模型可以分为5部分,分别是时空信息编码器、静态嵌入、动态演化嵌入、空间相互影响表示学习、特征融合与损失函数,经过以上五个模块,在保持时间依赖的前提下实现并行训练。
数据集
数据集:
纽约市(NYC)和芝加哥(Chicago)的真实时空数据集。
数据构成:
时空数据:城市网格划分:按经纬度将纽约市(NYC)排除公园 / 湖泊等无碰撞区域);
时间切片:将时间按 1 小时为单位分割(如 2016-06-01 16:00-17:00 为一个切片)。
特征数据:
静态特征:POI(车库、学校、商业区等)、交通设施(公交站、高速、信号灯)、天气(降雨 / 积雪 / 温度);
动态特征:交通流量(出租车上下车位置 / 时间)、历史碰撞事件;
标签:每个 “网格 - 时间切片” 的二元标签(1 = 有碰撞异常,0 = 无异常)。
!!天气属于静态特征!!
天气的数据量太大了,太复杂了,且目前找不到每时每刻的。
数据预处理(3 步):
归一化:用 Max-Min 归一化将所有特征(如 POI 数量、交通流量)映射到 [0,1] 区间,避免因特征量级差异(如 POI 数为 “千级”,天气温度为 “十级”)导致模型偏向量级大的特征;
特征构造:计算 “差异特征$D_t$”对每个网格,用当前时刻的静态特征(如当前交通流量)减去 “过去 5 个正常时刻的特征均值”,公式为:$ D_t^l = O_t^l - \frac{1}{n} \sum_{i=1}^n O_i^l \quad (t_i, \text{ nor}) $($O_t^l$为网格 l 在 t 时刻的原始特征,n=5 为历史正常样本数);
设计意图:异常事件的特征通常偏离正常状态,能放大这种偏离,帮助模型快速识别异常;
- 数据集划分:按 “时间顺序” 将数据分为训练集(60%)、验证集(20%)、测试集(20%),而非随机划分 —— 避免未来数据泄露到历史数据中(如用 2016 年 12 月数据训练,预测 2015 年数据,不符合真实场景)。
数据集老师是最喜欢问的模块
时空信息编码器
将 “位置 / 时间” 转化为可计算向量:
解决 “空间位置” 和 “时间戳” 无法直接输入模型的问题,通过编码保留 “相邻网格的空间关联性” 和 “事件的时间演化性”,为后续特征融合打基础。
为什么将 “位置 / 时间” 转化为可计算向量 ?
1. 它们是非线性的
2. 它们的编码必须是周期的,地球是球形是连在一起的
3. 增加语义信息,例如:北京和华盛顿是首都的信息,这样两座城市能够关联起来
(1)网格空间编码器(处理 “空间位置”)
输入:网格的经纬度坐标(纬度$l_{lat}$,经度$l_{lon}$);
编码逻辑:用正弦 / 余弦函数设计二维位置编码,确保 “相邻网格的编码向量具有线性相关性”,公式分两步:
① 对纬度 ($l_{lat}$) 编码(维度 D):$PE(l_{lat}, 2k) = \sin\left(\frac{l_{lat}}{10000^{2k/D}}\right)$
$PE(l_{lat}, 2k+1) = \cos\left(\frac{l_{lat}}{10000^{2k/D}}\right), \quad (k = 0,1,\ldots,D/2-1)$
创建了一个几何衰减的频率序列,更好的捕捉微小/宏观变化特征。
② 对经度 ($l_{lon}$) 执行相同编码(维度 D),再与纬度编码拼接(横着拼在一起),得到网格的空间编码向量 $PE(l_{lat}, l_{lon}) \in \mathbb{R}^{2D}$
其中D表示维度,k表示采集频率
设计意图:
- 模型能识别 “固定规律的差值 = 时空专属”。
- 模型能通过 “相似度阈值” 快速识别相邻,适配 GCN / 注意力机制。
经纬度为什么不直接归一化表示呢?(原理讲解)
1. 地理位置完全失真,再也不知道原来位置是什么了,模型失去了学习“绝对位置风险”的能力。
2. 空间邻近性与相对关系断裂,如在经度边界附近,(0.95, 0.5)和(0.05, 0.5)在数值上一
个在最右,一个在最左,距离是0.9,但现实中它们可能是相邻的(因为经度是循环的,东经
179.9度和西经179.9度在地球上是紧邻的)。//解决周期问题
3. 非线性。
(2)相对时间编码器(处理 “时间戳”)
输入:当前时间 t 与历史事件起始时间$t_1$的时间差(而非绝对时间,如 “距离上次碰撞已过去 3 小时”);
编码逻辑:用指数衰减函数编码时间差,公式为:$ZE(t, 2k) = \sin\left(\frac{t - t_1}{10000^{2k/D}}\right)$ $ZE(t, 2k+1) = \cos\left(\frac{t - t_1}{10000^{2k/D}}\right)$
最终得到时间编码向量 $ZE(t) \in \mathbb{R}^{2D}$;
设计意图:
- 模型能识别 “固定规律的差值 = 时空专属”,不被其他特征干扰。
- 模型聚焦 “事件间的时间间隔”,避免过早受到绝对时间的 “周期性干扰”(如同一时刻每天的风险不同)。//时间间隔学的是通用规律,绝对时间学的是绝对规律不一定适用。
为什么用相对时间?而非绝对时间,每天的绝对时间没有特征么?比如早晚高峰时间?
1. 绝对时间的特征是 “绑定具体场景” 的,不是 “通用规律”,若直接编码绝对时间(比如每天 18:00
的编码固定),模型会学到 “18:00 = 高风险” 的虚假规律。
绝对时间思维(笨):
"2025年3月15日14:30发生过事故,所以这个时间点危险"
问题:明年3月15日14:30呢?不知道!
相对时间思维(聪明):
"周六下午、雨后2小时、高速路段,容易出事"
规律可推广!明天周六下午雨后也危险
2. 风险是 “事件驱动的,且随时间间隔衰减”。
3. 且绝对时间可以后面动态特征加上了,可以考虑但是不适合作为一个基础的东西考虑
静态嵌入
整合 “静态特征 + 时空编码 + 差异特征”,形成能反映 “当前网格基础风险” 的向量,突出异常事件的 “特征偏离”。
具体操作(3步):
输入特征:原始静态特征 $O_t \in \mathbb{R}^{N \times D}$(N 为网格数,D为特征维度,如 POI、天气)、差异特征 $D_t \in \mathbb{R}^{N \times D}$(当前与历史正常的偏差);
特征融合:将 $O_t$ 与 $D_t$ 拼接,得到“静态特征基础向量” $O_t \oplus D_t \in \mathbb{R}^{N \times 2D}$($\oplus$ 表示拼接);
加入时空编码:将“静态特征基础向量”与“空间编码 PE” “时间编码 ZE”相加,得到最终静态嵌入 $X_t^s \in \mathbb{R}^{N \times 2D}$(注:此处维度仍为 2D,因 PE 和 ZE 的信息已通过融合融入,实际计算中会调整维度匹配);
时空编码的D是自己人为设定的,但是数据集中的D是定死的;
假如人为设定的D和数据集中的D不相等怎么办呢?
答:要进行信息筛选或信息融合。
动态演化嵌入
解决“数据不平衡”和“动态特征过平滑”问题:通过“Update-Decay”机制,让动态特征“记住稀有异常”“遗忘冗余正常”,保留事件的时间演化规律。
具体操作(三步):
- 动态嵌入初始化状态
训练开始时,所有网格的动态嵌入 $X^d_{t=0} \in \mathbb{R}^{N \times 2D}$ 初始化为 0 向量——表示“无历史事件记忆”。
空白向量会和流量等动态特征相加。
- Update 操作(触发条件:网格 $l$ 在 $t$ 时刻有碰撞异常,标签 $y=1$)
计算逻辑:$X^d_{(t,l)}=\sigma(X^s_{(t,l)}\cdot W_1+X^d_{(t-1,l)}\cdot W_2)$
其中:$\sigma$ 为 sigmoid 激活函数(控制输出在 $[0,1]$),$W_1 \in \mathbb{R}^{2D \times 2D}$、$W_2 \in \mathbb{R}^{2D \times 2D}$ 为可训练权重矩阵;
- Decay 操作(触发条件:网格 $l$ 在 $t$ 时刻无异常,标签 $y=0$)
计算逻辑:$X^d_{(t,l)}=X^d_{(t-1,l)}\cdot e^{-\phi\cdot(t-t_\theta)}$
其中:$\phi$ 为衰减常数(论文设为 2),$t_\theta$ 为网格 $l$ 上一次发生异常的时间;
1. 为什么更新过程有静态特征,而衰减过程没有静态特征?
静态特征是 “风险的基础盘”,不同网格面对相同动态变化表现形式应该是不一样的,
但是如果时刻考虑静态特征,可能造成动态特征过平滑问题,实验证明,更新时考虑
效果好,遗忘如果考虑会影响效果,有画蛇添足的意味。
2. 如何处理正常数据的?(如何平衡正常和异常数据的?/如何淡化正常数据的影响?/如何解决数据类型不平衡问题?)
通过update-decay操作,碰撞时学习异常数据,未发生碰撞时遗忘正常数据。
创新点:
加入自适应平滑门
解释:
时间序列: [11, 13, 9, 13, 15, …] ← 有噪声抖动!
真实情况: [11, 13, 11, 13, 15, …] ← 应该更平滑
让动态特征更加稳定可靠,增强鲁棒性(泛化能力/通用性)。
空间相互影响表示学习
解决“单一空间依赖建模不足”问题:
从“功能相似”“碰撞历史”“交通状况”三个视角,学习网格间的复杂交互(如“相邻商业区网格”比“相邻公园网格”碰撞风险更相关)。
具体操作(三步):
构建三类空间图(多视角建模空间关联)
为每个城市构建 3 个无向图,$G=(V,A)$($V$ 为网格节点,$A$ 为邻接矩阵),分别对应不同关联维度。
功能相似图 $G_F$:基于 POI 分布相似度(如“均为商业区”的网格更相关)
碰撞关联图 $G_A$:基于历史碰撞记录相似度(如“碰撞次数、伤亡情况相似”的网格更相关)
交通状况图 $G_T$:基于交通设施分布相似度(如“均为高速密集区”的网格更相关)
单一图无法覆盖所有空间关联(如某网格与远处的“同类商业区网格”风险更相关,而非地理邻近的“公园网格”),三类图从不同维度互补。
注意力机制多图卷积(Multi-GCN with Attention)(同样为了防止过平滑)
为每个空间图设计“空间注意力块(SP 块)”,学习邻居网格的“贡献权重”(避免平等对待所有邻居)
具体流程:
输入:静态嵌入序列 $X_s=[X^s_{t-T+1},\cdots,X^s_t]\in \mathbb{R}^{T\times N\times 2D}$($T=5$ 为历史时间切片数)、动态嵌入序列 $X_d=[X^d_{t-T+1},\cdots,X^d_t]\in \mathbb{R}^{T\times N\times 2D}$;
注意力权重计算(以动态嵌入 $X_d$ 为例):
定义 Query(查询)、Key(键)、Value(值):$Q_d=X_d\cdot W_{dq}$($W_{dq}\in \mathbb{R}^{2D\times 2D}$ 为权重矩阵) $K_d=X^{(k+1)}_d\cdot W_{dk}$($X^{(k+1)}_d$ 为邻居网格的动态嵌入,$W_{dk}\in \mathbb{R}^{2D\times 2D}$)$V_d=K_d$(值与键来源一致,简化计算)
计算注意力权重(Softmax 归一化):$A_d=\mathrm{Softmax}\left(\frac{Q_d\cdot K_d^T}{\sqrt{2D}}\right)\in \mathbb{R}^{T\times N\times 1\times (k+1)}$ ($\sqrt{2D}$ 为缩放因子,避免权重过大)
邻居特征聚合:$X'_d=A_d\cdot V_d\in \mathbb{R}^{T\times N\times 2D}$(将邻居特征按权重加权求和)
静态嵌入 $X_s$ 执行相同操作,得到 $X'_s$;
残差连接:为避免梯度消失,将聚合后的特征与原始特征相加,公式为:$X_f^1 = X'_s \cdot W_s + X'_d \cdot W_d + [X_s; X_d]$
($W_s, W_d \in \mathbb{R}^{2D \times 2D}$ 为权重,$[X_s; X_d]$ 为原始特征拼接);
通过注意力机制,模型能自动判断 “哪个邻居对当前网格的风险影响更大”(如某邻居近期频繁异常,其权重更高)。
多图联合学习
将三类图($G_F$,$G_A$,$G_T$)的 SP 块输出特征投影到统一空间,公式为:$X_f^v = X_f^F \cdot W_{GF} + X_f^A \cdot W_{GA} + X_f^T \cdot W_{GT}$
其中:$X_f^F$,$X_f^A$,$X_f^T$ 分别为三类图的 SP 块输出,$W_{GF}$,$W_{GA}$,$W_{GT} \in \mathbb{R}^{4D}$ 为可训练权重(反映每类图的贡献度);
避免简单拼接导致的“特征冗余”,让模型自动学习“哪类空间关联对预测更重要”
(实验证明 $G_A$ 贡献最大,因历史碰撞记录最能反映风险模式)。
1. 为什么K和V设计能一致(邻居动态键和动态值设置的相等,但是不怎么影响效果?)
K和V两个都可以直接拿数值表示,方便且快速。
2. 为什么两个地方越像,影响越大?
不要瞎举例子!!!
这个场景当中,是越像影响越大,但具体情况还得看自己的Q和K是如何设计的。
根据注意力机制公式,两个向量越相似,最终得到的结果越大,而我在这个项目中,
设置相似功能的城市,它们的向量也相似,因此得出的结果更大。
特征融合与预测
整合“时空演化特征”和“空间关联特征”,通过时序建模输出每个网格的异常概率。
具体操作(两步):
- FC-LSTM 层(捕捉时空依赖):
输入:多图联合特征 $\hat{X}_f \in \mathbb{R}^{T \times N \times 4D}$($T=5$ 为时间切片数,$4D$ 为特征维度);
作用:同时建模“时间维度的演化”(LSTM 层)和“特征维度的关联”(FC 层):
① FC 层:将每个网格的 $4D$ 特征映射为非线性表示,捕捉“静态 - 动态特征的交互”(如“雨天 + 近期异常”的组合风险);
② LSTM 层:处理 $T$ 个时间切片的特征,捕捉“时间序列依赖”(如“连续 2 小时流量异常→下 1 小时碰撞风险高”);
输出:LSTM 的隐藏状态 $H_t \in \mathbb{R}^{N \times 4D}$(包含 $N$ 个网格的时空融合特征)。
- 全连接层:
输入:LSTM 隐藏状态 $H_t$;
计算逻辑:通过全连接层 + Sigmoid 激活函数,将特征映射为 $[0,1]$ 区间的概率:$\hat{Y}_{t+1} = \sigma(H_t \cdot W_3 + b)$
其中:$W_3 \in \mathbb{R}^{4D \times 1}$ 为权重矩阵,$b$ 为偏置,$\hat{Y}_{t+1} \in \mathbb{R}^{N}$ 为每个网格的“下一时间切片异常概率”;
创新加入一个后处理机制
Streaming 后处理(hysteresis-only):牺牲一定的性能,但是更加面向应用。
给"开启"和"关闭"设置不同的阈值:
th_on = 开启报警的阈值(较高)
th_off = 关闭报警的阈值(较低)
gap = th_on - th_off = 滞后间隙
时间: t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
风险: 0.5 0.6 0.72 0.68 0.71 0.69 0.73 0.67 0.66 0.65
阈值: 0.70(超过则报警)
朴素决策:
报警: 无 无 ✓ 无 ✓ 无 ✓ 无 无 无
提高召回率(recall)
//对应的伪代码
for 每个时刻:
风险分数 = model.predict(当前特征)
if 当前状态 == "无报警":
if 风险分数 >= th_on: # 需要较强的证据才开启
当前状态 = "报警"
触发报警() #上面这里删掉,因为这一块还是有风险的
else: # 当前状态 == "报警"
if 风险分数 <= th_off: # 需要较弱的证据就关闭
当前状态 = "无报警"
关闭报警()
损失函数
损失函数:告诉你离满分差多少,并指导你该重点复习哪些知识点。
医疗诊断(假阴性代价高)#这种要求准备率可以不那么高,但是召回率必须高!!!
# 加权交叉熵,给正样本更高权重
def weighted_bce(y_true, y_pred):
weight_positive = 10.0 # 漏诊代价高(必须能检测出所有患病的,即使误报,再复查一下就好了)
loss = - (weight_positive * y_true * tf.math.log(y_pred) +
(1 - y_true) * tf.math.log(1 - y_pred))
return tf.reduce_mean(loss)
推荐系统(关注排名而非绝对分数)#这种就是准确率越高越好
# 结合分类、回归、置信度损失
def yolo_loss(y_true, y_pred):
# 分类损失
class_loss = categorical_crossentropy(y_true[:, :num_classes],
y_pred[:, :num_classes])
# 边界框回归损失(使用CIoU)
bbox_loss = ciou_loss(y_true[:, num_classes:num_classes+4],
y_pred[:, num_classes:num_classes+4])
# 置信度损失
conf_loss = binary_crossentropy(y_true[:, -1], y_pred[:, -1])
return class_loss + λ1 * bbox_loss + λ2 * conf_loss
模型训练的“优化目标”:同时解决①数据不平衡(异常样本少);②动态特征过平滑(正常与异常特征趋同)。
- 改进 Focal Loss(通过交叉熵解决数据不平衡)仅通过“难度权重”关注难分类样本,未考虑动态特征的演化;
$L_F=-\alpha\cdot(1-\hat{Y})^\gamma\cdot Y\cdot\log(\hat{Y})-(1-\alpha)\cdot\hat{Y}^\gamma\cdot(1-Y)\cdot\log(1-\hat{Y})$
其中:$\alpha=0.25$(平衡正负样本权重),$\gamma=2$(放大难分类样本的损失),$\epsilon=0.9$(对预测概率 $>0.9$ 的易分类样本,损失衰减);
- 动态损失(解决过平滑)
计算逻辑:仅在 Update 操作($y=1$)时生效,公式为:$L_D=\max(0,a-|X_{(t,l)}^d-X_{(t-1,l)}^d|)$
其中:$a=6$ 为阈值(论文实验确定);
- 最终损失函数
将两种损失加权融合,公式为:$L=L_F+\lambda\cdot L_D$
交叉熵
标志:log
解决:数据不平衡问题
扩展补充
模型训练与优化
采用按时间顺序批处理训练策略,不采用随机处理以防破坏时序。
优化器采用Adam(自适应学习率,适合大规模时空数据)。
采取早停策略,验证集性能连续 5 个 epoch 不提升则停止,降低训练开销并防止过拟合训练。
最终输出:每个城市网格在 “下一个时间切片”(如 1 小时后)的异常概率,
预测判断:概率 > 0.5→预测为 “异常”(需预警),否则为 “正常”。
评判指标
accu(总体准确率):所有样本(正常 + 异常)中,预测正确的比例。
precision(精确率):模型预测为 “异常” 的样本中,实际真的是异常的比例。
recall(召回率):实际是 “异常” 的样本中,被模型预测为异常的比例。
F1 分数:精确率和召回率的调和平均(而非算术平均),优先保障二者的平衡。
ROC-AUC:遍历所有预测阈值,计算 ROC 曲线下面积,反映模型对 “异常 / 正常样本” 的整体区分能力。
AP:平均准确率,计算不同召回率下的精确率均值,聚焦 “高得分样本的精准度”(排序型评估)。