告别盲目监测:一文看懂单变量与多变量时间序列异常检测(TSAD)的核心差异
告别盲目监测:一文看懂单变量与多变量时间序列异常检测(TSAD)的核心差异
在工业互联网、智能运维(AIOps)以及金融风控领域,时间序列异常检测(TSAD) 始终是核心课题。面对成千上万的传感器数据,你是该选择针对单一指标的“精耕细作”,还是选择多指标关联的“全局统筹”?
本文将深度拆解单变量与多变量时间序列的区别,并提供基于 Python 的实战演练。
一、 核心概念:维度之下的异常本质
在进入代码之前,我们先厘清两个核心概念。
1.1 单变量时间序列(Univariate Time Series)
单变量序列是指在每个时间戳上只有一个观察值。
- 数学定义:X={x1,x2,…,xt}X = \{x_1, x_2, \dots, x_t\}X={x1,x2,…,xt},其中 xt∈Rx_t \in \mathbb{R}xt∈R。
- 异常特征:异常通常表现为点异常(Point Anomaly,如数值突然飙升)或上下文异常(Contextual Anomaly,如白天的低功耗在半夜就成了异常)。
1.2 多变量时间序列(Multivariate Time Series)
多变量序列在每个时间戳上包含多个相关的观察值(特征)。
- 数学定义:X={x1,x2,…,xt}X = \{\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_t\}X={x1,x2,…,xt},其中 xt∈Rd\mathbf{x}_t \in \mathbb{R}^dxt∈Rd,d>1d > 1d>1。
- 异常特征:除了点异常,更多的是关联异常。例如:压力和温度单独看都在正常范围,但“压力上升”的同时“温度下降”可能意味着设备泄露。
二、 常用实战技巧与 Demo
2.1 简单入门:单变量 3-Sigma 准则
对于符合正态分布的单变量数据,3-Sigma 是最简单有效的手段。
Python
import numpy as np
import pandas as pd
# 构造模拟数据
data = np.random.normal(0, 1, 100)
data[50] = 5 # 离群点
def sigma_detection(series):
mean = np.mean(series)
std = np.std(series)
threshold = 3 * std
is_anomaly = np.abs(series - mean) > threshold
return is_anomaly
print(f"检测到的异常索引: {np.where(sigma_detection(data))[0]}")
2.2 高级技巧:多变量关联检测(Isolation Forest)
在企业级场景中,我们常用**孤立森林(Isolation Forest)**来处理多维数据的关联异常。
Python
from sklearn.ensemble import IsolationForest
import pandas as pd
# 模拟多维数据:温度、压力、转速
df = pd.DataFrame({
'temp': [20, 21, 19, 100, 20],
'press': [1.0, 1.1, 0.9, 1.0, 5.0]
})
model = IsolationForest(contamination=0.1, random_state=42)
df['anomaly'] = model.fit_predict(df[['temp', 'press']])
# -1 代表异常,1 代表正常
print(df)
2.3 常见错误:忽略“滞后性”
错误现象:在多变量检测中,直接计算 ttt 时刻的关联,忽略了 A 指标的变化可能在 t+5t+5t+5 时刻才反应在 B 指标上。
修正方法:使用 滑动窗口(Sliding Window) 或 交叉相关函数(CCF) 预处理数据,对齐时间差。
2.4 调试技巧:得分平滑化
问题:模型输出的异常得分(Anomaly Score)剧烈抖动,导致频繁误报。
方案:对 Score 进行简单移动平均(SMA):
Python
# 假设 scores 是模型输出的原始得分
smooth_scores = pd.Series(scores).rolling(window=5).mean()
三、 深度原理解析
3.1 什么是“维度灾难” (Curse of Dimensionality)?
在多变量 TSAD 中,随着变量增加,空间的体积呈指数级增长,数据点变得稀疏。传统的欧几里得距离失效,这要求我们必须使用**降维(PCA)或嵌入(Embedding)**技术。
3.2 什么是马氏距离 (Mahalanobis Distance)?
在多变量检测中,标准欧氏距离忽略了变量间的相关性。马氏距离通过引入协方差矩阵的逆,能够衡量点到多元分布中心的距离,是处理多变量线性相关的利器。
DM(x)=(x−μ)TΣ−1(x−μ)D_M(\mathbf{x}) = \sqrt{(\mathbf{x} - \mathbf{\mu})^T \Sigma^{-1} (\mathbf{x} - \mathbf{\mu})}DM(x)=(x−μ)TΣ−1(x−μ)
四、 实战项目演练:基于 LSTM-AD 的多变量异常检测
我们将构建一个简单的 LSTM 预测模型。基本思路是:用过去的数据预测未来,如果实际值与预测值偏差过大,则判定为异常。
4.1 环境准备
Bash
pip install numpy pandas scikit-learn tensorflow matplotlib
4.2 代码实现
本例模拟一个双变量系统(如服务器 CPU 和内存使用率)。
Python
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
# 1. 生成模拟多变量数据(正弦波 + 噪声)
def create_data():
t = np.linspace(0, 100, 1000)
s1 = np.sin(t) + np.random.normal(0, 0.1, 1000)
s2 = np.cos(t) + np.random.normal(0, 0.1, 1000)
# 注入异常:在 800 处让两个变量同步飙升
s1[800:810] += 5
s2[800:810] += 5
return pd.DataFrame({'f1': s1, 'f2': s2})
df = create_data()
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(df)
# 2. 构造滑动窗口数据
def create_dataset(X, time_steps=10):
Xs, ys = [], []
for i in range(len(X) - time_steps):
Xs.append(X[i:(i + time_steps)])
ys.append(X[i + time_steps])
return np.array(Xs), np.array(ys)
TIME_STEPS = 20
X, y = create_dataset(data_scaled, TIME_STEPS)
# 3. 构建并训练 LSTM 模型
model = Sequential([
LSTM(64, activation='relu', input_shape=(X.shape[1], X.shape[2])),
Dense(X.shape[2])
])
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=20, batch_size=32, verbose=0)
# 4. 异常检测:计算预测误差
predictions = model.predict(X)
mse = np.mean(np.power(y - predictions, 2), axis=1)
# 5. 可视化
plt.figure(figsize=(12, 6))
plt.plot(mse, label='Reconstruction Error')
plt.axhline(y=np.percentile(mse, 99), color='r', linestyle='--', label='Threshold')
plt.title("Multivariate Anomaly Detection via LSTM Error")
plt.legend()
plt.show()
4.3 执行预期结果
运行后,你会看到一张误差曲线图。由于 800 个点处我们注入了大幅度的值变动,模型预测失效,MSE(均方误差)会瞬间拉起一个极高的尖峰,超过 99% 分位线的点即被标记为异常。
五、 总结:如何选择?
| 特性 | 单变量 (Univariate) | 多变量 (Multivariate) |
|---|---|---|
| 计算复杂度 | 低,适合实时性要求极高的场景 | 高,需要强大的算力支持 |
| 检测能力 | 仅限数值越界、趋势改变 | 可检测变量间的协同失效 |
| 典型算法 | ARIMA, Prophet, SR-CNN | LSTM-NDT, DAGMM, Graph-AD |
| 适用场景 | 单个传感器监控 | 复杂工业设备、微服务系统 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)