想象你是一位体检中心的资深医生,每天要面对成百上千份健康报告。普通人刚拿到报告时,只会盯着“这次的心率是 90,参考范围是 60-100,正常!”——但你看报告的方式完全不同。你会把这份报告和这个人过去三年的报告放在一起看:他的心率一直在 55 左右徘徊,最近突然飙到 90,这不对劲;他的体温在每年冬天都会有一个小高峰,今年冬天这个高峰却迟迟没出现,这也不寻常。你关注的不是“单次数值是否在标准范围内”,而是“这条随时间变化的曲线,是否遵循着它该有的节奏”。 这就是时间序列异常检测的本质。无论监控服务器的 CPU 使用率、观测工厂设备的振动频率,还是追踪一只股票的交易量,我们面对的都是一条随时间流动的数据曲线。这条曲线通常有自己的“脾气”:有长期走向(趋势),有周期性波动(季节),还有随机抖动(噪声)。揪异常,就是判断某个时刻的数值是不是“性格突变”——它背叛了这条曲线应该有的样子。现实中常用的方法有滑动窗口统计、STL 分解、Prophet 残差、ARIMA 残差等,它们各有各的“体检手段”,但目标高度一致:把那颗“多余的心跳”从正常的生命节奏里准确挑出来。
对 AI 从业者而言,时间序列异常检测是 AIOps、运维监控、风控系统的基石能力。掌握它,你就能从数据洪流中快速定位“谁在说谎”,把被动救火升级为提前预警——这是每一家数字化企业都愿意为之付费的核心技能。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
滑动窗口统计:局部均值和标准差
时序认知
老医生看体检报告,从来不会把每一个数字孤零零地拿出来看,而是先看整条曲线的“长相”:这人的体重在十年里是缓慢上坡还是平稳如镜?每年冬天他的血压是否会规律性升高?今天早上测的数值,到底是正常的起伏,还是背弃了多年来的节奏?看时间序列数据也一样,得先认识它的三个“性格组件”。
一份按小时记录的服务器 CPU 使用率数据,展开来看,是由三种信号叠在一起的。第一种叫趋势项,是数据整体上持续向上或向下的大方向,就像人的体重随年龄缓慢增加的长期走向。第二种叫季节项,是固定时间间隔内重复出现的波动模式,好比工作日早高峰的流量总是高于凌晨三点——这是以 24 小时为周期的“生物钟”。第三种叫噪声项,是除去上述两者后剩下的随机抖动,就像测量血压时手臂微微一抖带来的细微偏差,没有规律可言。
要对这样的数据做异常检测,首先要把它的“性格”摸清楚。一个人从 20 岁到 40 岁体重涨了 10 公斤,这是趋势;他每天吃完午饭血糖有一个小高峰,这是季节;今天测量时血糖突然比平时高出两倍,这才是异常。理解三大组件,是后面所有检测方法的地基。
老医生看完曲线长相,心里就有了底:这条曲线的“性格”是什么,什么范围的波动是它的常态。接下来要做的,就是判断某一次测量是否违背了这个“性格”——这正是后续各章要解决的事。
- 观测值 \(Y_t\)表示第 \(t\) 个时刻测到的真实数值,比如今天 10 点的 CPU 使用率。
- 趋势项 \(T_t\)刻画数据长期的方向性变化,比如大盘流量随业务增长逐年抬升。
- 季节项 \(S_t\)刻画固定周期的波动规律,如每天 24 小时的峰谷交替。
- 噪声项 \(R_t\)刻画无法解释的随机扰动,通常假设均值为零、幅度有限。
平稳性检验
老医生面对一个新来的病人,第一件事不是开检查单,而是先判断这位病人的身体是否处于“稳定状态”:如果他在发高烧、在剧烈咳嗽,那么今天测的血压、心率全都不可信——先得等状态稳定下来。时间序列分析也是一样的逻辑,这个“身体是否稳定”的检查,叫平稳性检验。
平稳,通俗说就是这条曲线的“脾气”始终如一:均值不漂移、方差不变大、周期性不突然改变。反过来,如果一条曲线整体在持续上坡(比如逐年增长的业务量),那它的均值一直在变,是不平稳的。平稳性检验(常用的有 ADF 检验)就是在回答一个问题:这条序列的统计性质是否随时间改变?
如果检查出来不平稳,最常见的“治疗手段”是差分。差分就像医生量“变化量”而不是“绝对量”:病人今天量体重 80 公斤,昨天 79.9 公斤,那我们不关注 80 这个绝对数,而是关注“+0.1 公斤”这个变化。对序列求一阶差分,就是把原始值变成“这一刻减上一刻的差”,很多原本持续上漂的曲线,差分会变成围绕零小幅波动——平稳了,可以进入后续分析了。
医生确定病人状态稳定后,才敢把后续检查结果当作“正常参考”。时间序列也如此:先确认数据“性情稳定”,之后用的滑动窗口和 3σ 才有意义——给一个持续上漂的序列硬套固定阈值,就像给发烧病人测静息心率,得出的结论全是错的。
- \(Y_t\)(当前时刻值)比如今天 10 点的 CPU 使用率为 65%。
- \(Y_{t-1}\)(上一时刻值)比如 9 点的 CPU 使用率为 60%。
- \(\Delta Y_t\)(差分结果)两者相减得 +5%,表示这一小时的变化量。
滑动窗口
老医生不会拿“所有病人”的血红蛋白正常范围来评判眼前这位——他会调出这位病人最近三个月的化验单,看最近几次的数值是否偏离了他自己的基线。滑动窗口干的就是这件事:不跟全量历史比,只跟“最近这一段”比。
具体做法是取一个固定大小的窗口(比如最近 24 小时的监控数据),沿时间轴一步一步向前滑动。每到一个新位置,就计算窗口内数据的滚动均值和滚动标准差。滚动均值相当于“这位病人最近的正常水平”,滚动标准差则给出“正常水平”的浮动范围。下一个时刻的新数据点进来后,便拿它与窗口内的均值、标准差做比较。
有了窗口内的均值 \(\mu\) 和标准差 \(\sigma\),传统做法是“3σ 准则”:数据点离均值超过 3 个标准差,就判为异常。但前面说过,时序数据有趋势和季节性,窗口内的均值和标准差如果又受趋势和季节的影响,粗暴套 3σ 会把正常的季节高峰误杀。所以更聪明的做法是修正:先剔除趋势和季节成分,或者只对残差套 3σ,相当于医生先把“年龄、性别、昼夜节律”这些因素校正掉,再判断某次测量是否真的异常。
滑动窗口是运维监控里最常用的“第一道防线”,计算简单、响应迅速,能秒级发现 CPU 飙升、流量跳水这类突变。但如果数据带有明显的季节节律(比如每天 0 点的流量总比 14 点低一大截),纯靠窗口统计仍会误报。这就要请出下一节的 STL 分解——把季节成分先拆干净。
- 窗口均值 \(\mu_w\)取最近 \(w\) 个点的均值,作为“此刻的正常水平”。
- 窗口标准差 \(\sigma_w\)衡量窗口内数据自身的波动幅度,告诉医生“正常水平”的可信区间有多宽。
- 判定条件 \(|X_t - \mu_w| > k\sigma_w\)若新点离窗口均值太远(超过 \(k\) 个标准差),就亮起异常红灯。
STL分解
病人每年体检时血压都会在冬天高一点、夏天低一点——医生早已熟悉这个节律,所以看到“冬天血压 140”并不会惊讶。但他会计算一件事:把季节变化剥掉之后,这次血压的“剩余部分”是不是还正常?STL 分解干的正是“剥皮”的工作。
STL 是“Seasonal-Trend decomposition using Loess“的缩写,一种把时间序列掰开揉碎的算法。它把原始序列 \(Y_t\) 分解为三块:趋势项(长期走向)、季节项(固定周期波动)、残差项(剩余部分)。残差项就是剔除了”长期脾气“和”周期性节律”之后,剩下的纯意外。异常检测的重心因此落到残差上:残差突然变大,说明今天的观测违背了常态。
有了残差序列,就可以沿时间轴计算残差的均值和标准差,再用“残差偏离超过 3 个标准差”来判异常。这比直接对原始序列套 3σ 精确得多——因为季节高峰不再是“意外”,而是被算进了“正常节律”里。若某一天的观测值连季节因素都解释不了,残差爆表,那就是真正的“性格突变”。此外,残差异常还可以细分为两类:点异常(单个时刻剧烈偏离)和模式异常(连续多个时刻都略偏高,趋势悄然改变)。
STL 分解像是给了医生一副“透视眼镜”:脱掉季节这套“外衣”后,骨架上的异常一目了然。不过 STL 对突发的“节假日效应”(比如双十一流量暴增)识别并不高效,因为这些极端值会被吸收到残差里一起变大。要处理这类“日历事件”,还得看下一节的 Prophet。
- 分解式 \(Y_t = T_t + S_t + R_t\)STL 用局部加权回归(Loess)迭代拟合出趋势 \(T_t\),再周期性地提取季节 \(S_t\),剩下的就是残差 \(R_t\)。
- 残差 \(R_t\)表示“趋势和季节都解释不了的那部分”。
- 异常判定 \(|R_t| > 3\sigma_R\)\(\sigma_R\) 是残差序列的标准差;残差超出该阈值,说明观测值严重偏离常态。
Prophet残差
一位经验丰富的全科医生不会只盯着化验单,他还会翻病人的日程本:上周病人参加了一场马拉松,今天测的肌酸激酶偏高——这是合理的应激反应,不是病变。Prophet 就是这样一个“会翻日程本”的模型,由 Facebook 开源,专门用来做带节假日、带趋势拐点的时间序列预测,再把预测残差用于异常检测。
Prophet 本质上是一个可解释的回归模型。它不像黑盒深度学习那样难以捉摸,而是明明白白地把时间序列拆成四块:趋势项(含变点)、季节项、节假日效应项、误差项。换句话说,它自带“日程本”——你提前告诉它哪天是双十一、哪天是黑色星期五,它就会在预测时把这两天的“购物节脉冲”算进正常范围。检测异常的流程便是:用 Prophet 拟合历史数据→预测当前时刻的期望值→计算实际值与预测值的残差→残差过大则告警。
Prophet 对趋势的刻画很有弹性。它允许你在整个时间范围内设置若干个“变点”(changepoints),相当于允许趋势线在特定时刻“拐弯”:比如业务在 2023 年 6 月进行了大规模推广,流量趋势陡然抬升,Prophet 会在那个点附近自动调整趋势斜率。这样,推广后的高流量不会被误判为异常——因为模型已经学会了“这里的基线变了”。
Prophet 最大的价值是“懂人情世故”:它不会把节假日高峰、大型促销造成的波动当成故障,而是把它们当作“日历上的已知事件”提前消化。但要注意,Prophet 是基于回归的思路,适合可解释性要求高、节假日效应明显的业务场景;如果数据本身的线性依赖关系很强,那就要考虑 ARIMA 这类统计模型。
- 趋势项 \(g(t)\)用分段线性或逻辑斯蒂曲线拟合长期走向,可在指定变点处改变斜率。
- 季节项 \(s(t)\)用傅里叶级数拟合周期性节律,支持年、周、日等多周期。
- 节假日项 \(h(t)\)对每个节假日前后若干天设置独立的影响窗口,吸收“日程本”里的突发脉冲。
- 误差项 \(\varepsilon_t\)模型解释不了的残差,异常检测的目标就是盯住它。
ARIMA残差
老医生有时会遇到一种“惯性体质”的病人:他今天的血压,很大程度上是由昨天、前天的血压决定的——异常不是忽然出现的,而是从小偏差慢慢累积起来的。ARIMA(差分自回归滑动平均模型)就是专门刻画这种“惯性”的统计模型,它通过捕捉时间序列自身的线性依赖关系来做预测,再用残差揪出真正的新异常。
ARIMA 全称 “Autoregressive Integrated Moving Average“,名字里藏着三个部件。AR(p) 是自回归:用前 \(p\) 个时刻的值预测当前值,相当于说”今天的血压 ≈ 昨天的血压 × 0.8 + 前天的血压 × 0.15“;I(d) 是差分:对序列做 \(d\) 阶差分使其平稳,相当于医生改看”变化量的变化“;MA(q) 是滑动平均:用前 \(q\) 个时刻的预测误差来修正当前预测,相当于参考过去几次”预测偏差”来纠偏。三者结合,ARIMA 能用一条公式把数据的线性惯性描述得明明白白。
异常检测的做法是:用历史数据拟合 ARIMA 模型→逐点预测→计算真实值与预测值的残差→残差超过阈值(比如 3 倍残差标准差)就告警。残差在这里的含义是“这段数据里模型没料到的部分”。如果模型学得够好,正常点的残差应该像背景噪声一样微弱、随机;一旦出现一个巨大残差,说明那一刻的数据产生了模型无法解释的突变——这就是异常。
ARIMA 是统计时序建模的“老牌选手”,它对线性关系挖掘深厚,适合数据量中等、规律相对稳定的场景。但它的短板也很明显:对节假日、突变拐点的自适应能力弱,需要人工判断阶数 \(p,d,q\)。如果数据既有强季节性又有节假日脉冲,STL 或 Prophet 通常是更省心的选择。
- 自回归项 \(\sum\phi_i Y_{t-i}\)当前值由过去 \(p\) 个真实观测值的加权和决定。
- 滑动平均项 \(\sum\theta_j \varepsilon_{t-j}\)用过去 \(q\) 个预测偏差来修正当前的估计。
- 当前残差 \(\varepsilon_t\)真实值减去模型预测值,是“模型没猜到”的部分。
- 差分阶数 \(d\)建模前对序列做几次差分,使其平稳,令均值和方差不再漂移。
实战流程
老医生要负责整个体检中心,他不可能只靠肉眼去看每一份报告——他要建立一套流水线:每天采集数据、每周校准参考基线、一旦病人出现危险信号立刻自动呼叫。工业级时间序列异常检测,同样是一条从数据到告警的完整流水线。
第一步是数据采集与蓄积。要把监控指标(CPU、内存、流量、交易量)按固定频率(如每分钟一次)持续记录,存成带时间戳的序列。蓄积的数据量至少要覆盖几个完整季节周期(比如至少 2-3 周),才能让模型学到“一周七天、每天 24 小时”的节律。第二步是离线训练基线:用历史数据训练/拟合检测模型(滑动窗口、STL、Prophet 或 ARIMA),计算出正常残差的均值与标准差,从而确定异常阈值。训练完成后还要定期更新——业务变了,基线也要跟着变。
第三步是在线实时检测:新数据点到达后,用训练好的模型计算残差,与阈值比较,一旦越过红线就触发告警。告警可以分级:单点突刺是 P3 警告,持续多个点偏离是 P2 提醒,整条曲线打破季节模式是 P1 紧急——就像医生根据指标的偏离程度决定是电话提醒、门诊复查还是立刻急诊。整个过程要控制误报率,否则告警泛滥会变成“狼来了”,让值班同学麻木。
回到体检中心的比喻:数据采集是预约体检、离线训练是制定每个病人的“个性化参考范围”、在线告警是出现危急值时的自动呼叫。整套流程环环相扣——没有稳定采集,模型就是无源之水;没有基线校准,告警就是无本之木;没有实时检测,前面的一切都只是事后复盘。将这根流水线建好,你便真正拥有了“给带时间的数据揪异常”的实战能力。
- 残差均值 \(\mu_R\)离线训练时算出的正常残差中心,通常接近零。
- 残差标准差 \(\sigma_R\)刻画正常残差的波动幅度。
- 警报阈值 threshold正常范围的上下边界,越界即告警。
AI 应用场景
AIOps 智能运维监控
阶段:模型训练与实时推理
解决的问题:传统运维监控依赖人工设定固定阈值(如 CPU > 80% 告警),但线上流量有明显的昼夜节律和周末低谷,固定阈值要么在高峰期疯狂误报,要么在低峰期漏报真正的问题。采用 STL 分解 + 滑动窗口修正后,系统自动学习每台服务器的“作息规律”,只在数据背叛自身基线时告警。
具体案例:某电商平台在双十一大促期间,订单量是平日的 20 倍。使用 Prophet 模型预先将大促标记为节假日效应,系统没有把流量暴涨误判为故障;而大促结束后某台数据库连接数异常突刺,被 STL 残差检测秒级捕捉,运维团队在用户感知前完成了扩容。
金融交易反欺诈
阶段:特征工程与模型预测
解决的问题:交易量、转账频率等金融时序数据与市场开闭市、工作日周末强相关。传统规则引擎难以区分“周五下午的正常高峰”和“洗钱行为导致的交易突增”。对每支股票/每张卡片的交易序列分别拟合 ARIMA,再用残差偏离度识别异常交易,能有效降低误报。
具体案例:某支付平台对单卡交易金额序列建立 ARIMA(1,1,1) 基线,某日凌晨 3 点该卡交易金额残差超过 8 倍标准差,触发风控拦截;事后核查确认是一批被盗账号在批量测试,拦截为该平台挽回数十万元损失。
设备预测性维护
阶段:离线训练 + 在线监测
解决的问题:工业设备(如风机、压缩机)的振动传感器读数带有明确的转频周期性,直接设阈值会把正常启停误判为故障。用滑动窗口提取振动幅度统计量,结合 STL 残差分析,可识别轴承磨损引起的微弱但持续的信号偏离。
具体案例:某风电场的齿轮箱振动监测中,STL 残差连续 6 小时小幅超出 2σ,未触发单点异常告警,但模式异常检测弹出“缓变漂移预警”,检修发现齿面已出现早期点蚀,避免了整机损毁。
Python 演示
import mathimport random def synthetic_series(n=500, trend=0.02, season_amp=8, seed=42): """生成带趋势、季节和噪声的模拟监控时序, 中间藏一个异常点.""" random.seed(seed) data = [] for i in range(n): seasonal = season_amp * math.sin(i / 12.0) # 24点周期的季节节律 noise = random.uniform(-1.5, 1.5) # 随机噪声 val = 50 + trend * i + seasonal + noise if i == 200: val = 80 # 注入异常突刺 data.append(val) return data def sliding_window_detect(series, window=24, k=3.0): """用滑动窗口计算均值与标准差, 对每个点做修正后3σ判定.""" anomalies = [] for i in range(len(series)): if i < window: continue win = series[i-window:i] mean = sum(win) / len(win) var = sum((x - mean) ** 2 for x in win) / len(win) std = math.sqrt(var) if std == 0: continue z = abs(series[i] - mean) / std if z > k: anomalies.append((i, series[i], z)) return anomalies def main(): series = synthetic_series() hits = sliding_window_detect(series) print("共检测到", len(hits), "个疑似异常点") for idx, val, z in hits[:5]: print("索引:", idx, "值:", round(val, 2), "偏离", round(z, 2), "个标准差") if hits: print("异常点集中在索引 200 附近:", any(abs(i-200) <= 1 for i, _, _ in hits)) if __name__ == "__main__": main()
seasonal = season_amp * math.sin(i / 12.0)用正弦函数模拟“每天 24 小时的峰谷节律”,这是季节项的化身。if i == 200: val = 80在第 200 个时刻注入一个明显的异常突刺,相当于医生体检报告里那颗“多余的心跳”。win = series[i-window:i]取最近 24 个点作为滑动窗口,只依赖“最近的身体状态”而非全量历史。mean = sum(win) / len(win)计算窗口均值,即“这一小段时间内的正常水平”。z = abs(series[i] - mean) / std计算新点偏离窗口均值多少个标准差,这是修正后的“3σ 判定得分”。
常见误区
误区时间序列就是一堆数,只要计算全局均值和标准差,任何点偏离超过 3 个标准差就是异常,简单又通用。
正解这个做法在序列平稳时勉强可用,但一旦序列带趋势(持续上涨),全局均值早已被“带偏”,趋势上的靠前点和靠后点会被系统性误判。正确做法是先做平稳性处理(如差分)或用滑动窗口的局部统计量,让“正常基线”跟着趋势走。就像判断一个孩子是否发烧,不能拿 60 岁老人的体温标准来比。
为何常见:初学者常把时序数据当作独立同分布的普通样本,忽略了“时间”这个维度带来的依赖性和非平稳性,因为教科书里的 3σ 通常先假设了正态分布和独立性。
误区只要当前值和前几天同一时刻的值差异很大,就一定是异常。比如今天下午 3 点的流量比昨天低了 40%,赶紧告警。
正解周二下午 3 点流量低于周一,可能只是正常的周季节效应。正确做法是用 STL 分解或 Prophet 先把季节成分剥离,只看残差是否异常。医生看到病人冬天血压升高,不会马上开药,而是先判断这是否是每年都有的季节节律。
为何常见:人类天生对“差异”敏感,容易忽略周期性重复模式,因为肉眼看曲线时很难同时追踪同相位的历史对比。
误区模型在双十一、除夕这类节假日频繁报异常,一定是模型不够准,我要去调参把它压下去。
正解恰恰相反,节假日的波动是“日历上的已知事件”,应该像 Prophet 那样显式建模节假日效应,让模型提前吸收这些脉冲。强行调参压低告警,反而会让真正的突刺被掩盖。双十一流量暴涨不是故障,是业务高峰;拿它当异常告警只会让值班团队“狼来了”。
为何常见:工程师习惯于让模型“追逐所有曲线形态”,却忽略了异常检测的目标是发现“模型和日历都无法解释的意外”,而非拟合一切已知节律。
误区异常检测就是把每个点和基线比,找出跳变的那一下。慢慢偏离基线的几个点都小于阈值,不用管。
正解很多真实故障(如设备磨损、内存泄漏)并非瞬间跳变,而是连续数小时乃至数天的小幅漂移累积。需要配合模式异常检测:连续 N 个点同向偏离、或残差的累计和超过阈值。像体温从 36.5 慢慢爬到 37.8,单看每次都在“正常范围”,但持续爬升本身已经是警报。
为何常见:单点检测最容易实现和解释,初学者容易把“实现最简单”误认为“覆盖最全面”,忽略了时序异常里同样重要的趋势性异常。
面试题
Q1. 时间序列通常由哪三个成分叠加而成?
- A.均值、方差、协方差
- B.趋势项、季节项、噪声项← 正确答案
- C.线性项、非线性项、混沌项
- D.回归项、分类项、聚类项
答案:B。\(Y_t = T_t + S_t + R_t\),趋势(长期走向)、季节(周期节律)、噪声(随机抖动)是时序的三块积木。A 是统计描述指标,C、D 与分解无关。就像体检报告里的体重曲线,长期走向是趋势、每天的起伏是季节、测量误差是噪声。
Q2. 关于平稳性检验,以下说法正确的是?
- A.平稳序列的均值和方差不随时间改变← 正确答案
- B.带趋势的序列一定是平稳的
- C.平稳性检验只对分类数据有效
- D.任何时序数据都必须先做差分才能分析
答案:A。平稳的核心是统计性质稳定:均值、方差不漂移。带持续上升趋势的序列均值一直在变,属于非平稳;差分只是处理非平稳的手段之一,不是万能必选项。就像发高烧的病人测静息心率不可信,状态不稳定时数据不可直接解读。
Q3. 一阶差分的数学定义是?
- A.\(Y_t + Y_{t-1}\)
- B.\(Y_t - Y_{t-1}\)← 正确答案
- C.\(Y_t \times Y_{t-1}\)
- D.\(Y_t / Y_{t-1}\)
答案:B。差分是“当前值减上一时刻值”,刻画变化量而非绝对量。持续上涨的曲线差分后往往围绕零波动,从而变平稳。如同医生关注“今天比昨天重了多少”,而不是只盯着“今天 80 公斤”。
Q4. 滑动窗口在异常检测中的主要作用是?
- A.将全局均值固定为常数基准
- B.用最近一段局部数据建立动态基线← 正确答案
- C.将非线性数据强制转为线性
- D.消除所有噪声使曲线完全光滑
答案:B。滑动窗口只取最近一段数据计算均值与标准差,让“正常基线”随时间移动,适应趋势与季节的局部变化。它不会让数据变光滑,也不做线性化,更不是全局固定常数,而是“跟诊最近状态的动态参考范围”。
Q5. 为什么对带明显季节性的时序直接套全局 3σ 会高误报?
- A.季节高峰会被误判为异常← 正确答案
- B.全局标准差一定为零
- C.均值必然等于中位数
- D.噪声会完全消失
答案:A。季节高峰是周期性正常波动,但会大幅偏离全局均值,于是被 3σ 误杀。正确做法是先用 STL 或 Prophet 剥掉季节成分,再对残差判异。就像医生不会因病人冬天血压升高而惊慌,因为那是每年都有的季节节律。
Q6. STL 分解将原始序列拆成哪几部分?
- A.趋势项← 正确答案
- B.季节项← 正确答案
- C.残差项← 正确答案
- D.梯度项
答案:ABC。STL 分解得到 \(Y_t = T_t + S_t + R_t\),分别对应趋势、季节、残差。梯度是优化里的概念,与 STL 分解无关。残差里无法解释的部分才是异常检测的目标。
Q7. Prophet 模型中“节假日效应项”的作用是?
- A.把所有节假日数据标记为异常
- B.在预测时为已知日期事件建立独立影响窗口← 正确答案
- C.删除节假日的全部数据点
- D.用聚类算法识别假期人群
答案:B。Prophet 通过 \(h(t)\) 为节假日建立影响窗口,让模型提前吸收双十一、春节等波动——这些波动被视为“日历上的已知事件”而不是异常。A 恰恰相反,节假日不应被判异常;C 和 D 与 Prophet 的季节节假日建模无关。
Q8. ARIMA(p,d,q) 中"d"代表的含义是?
- A.自回归阶数
- B.差分阶数← 正确答案
- C.滑动平均阶数
- D.数据维度
答案:B。AR(p) 是自回归阶数,I(d) 是差分阶数,MA(q) 是滑动平均阶数。差分是为了让非平稳序列变平稳,使后续的自回归和滑动平均建模有意义。顺序记忆技巧:ARIMA 正对应“自回归→差分→滑动平均”三个过程。
Q9. 以下哪些方法可以用于时间序列异常检测?
- A.滑动窗口 + 修正 3σ← 正确答案
- B.STL 分解后对残差判异← 正确答案
- C.Prophet 残差分析← 正确答案
- D.随机生成一个常数作为阈值
答案:ABC。A、B、C 都是正文介绍的成熟方案:滑动窗口建立动态基线、STL 剥离趋势季节、Prophet 吸收节假日后看残差。D 是胡闹——常数阈值既不能适应趋势也不能适应季节,必然高误报。
Q10. 某监控序列带有明显周季节效应,且每逢大促流量暴增数倍。要降低误报,最优先的做法是?
- A.直接对原始序列套全局 3σ
- B.用 Prophet 建模节假日效应后看残差← 正确答案
- C.删除所有大促日的数据
- D.将阈值调大 100 倍
答案:B。大促是“日历上的已知事件”,应该用 Prophet 的节假日项吸收,再对残差判异。A 会把季节高峰和大促全误杀;C 是丢弃信息;D 调大阈值会掩盖真正的故障。这就像医生会把马拉松赛后的肌酸激酶升高解读为正常应激,而不是直接报警。