悠悠楠杉
网站页面
正文:
在数据分析领域,时间序列的突变点检测是一个经典问题。无论是金融市场的异常波动、工业设备的故障预警,还是用户行为的突然变化,快速准确地识别这些突变点至关重要。CUSUM(Cumulative Sum Control Chart)算法因其高效性和灵活性成为业界常用方法之一。本文将详细介绍如何用Python实现CUSUM算法,并附上实战代码。
突变点(Change Point)是指时间序列中统计特性(如均值、方差)发生显著变化的时刻。例如,某产品的日销量长期稳定在1000件左右,突然连续几天飙升至2000件,这个转折点即为突变点。
CUSUM算法的核心思想是通过累积偏差来检测突变。其步骤如下:
1. 计算残差:用观测值减去预期值(如历史均值)。
2. 累积求和:对残差进行累积,放大微小但持续的偏差。
3. 判断阈值:当累积值超过预设阈值时,判定为突变点。
数学公式如下:
[ St = \max(0, S{t-1} + x_t - \mu - k) ]
其中,( \mu )为基线均值,( k )为允许的偏差容限。
以下是基于numpy和matplotlib的完整实现:
import numpy as np
import matplotlib.pyplot as plt
def cusum_detection(data, threshold=5, drift=0.5):
n = len(data)
mu = np.mean(data)
cumsum = np.zeros(n)
cp = [] # 存储突变点索引
for t in range(1, n):
cumsum[t] = max(0, cumsum[t-1] + (data[t] - mu) - drift)
if cumsum[t] > threshold:
cp.append(t)
cumsum[t] = 0 # 重置累积和
return cp
# 生成测试数据
np.random.seed(42)
data = np.concatenate([np.random.normal(0, 1, 100), np.random.normal(5, 1, 100)])
# 检测突变点
change_points = cusum_detection(data, threshold=10)
# 可视化
plt.plot(data, label='Time Series')
for cp in change_points:
plt.axvline(cp, color='r', linestyle='--', alpha=0.5)
plt.legend()
plt.show()
代码解析:
1. cusum_detection函数接收时间序列数据、阈值和漂移参数。
2. 通过动态更新累积和,当超过阈值时记录突变点位置。
3. 测试数据模拟了均值从0到5的突变,红色虚线标出检测结果。
threshold和漂移drift需根据数据分布调整,可通过历史数据回测确定。