变化点分析(Change Point Analysis,CPA)
变化点分析(Change Point Analysis, CPA)是一种用于检测时间序列数据中统计属性发生显著变化的点的方法。这种分析方法常用于环境科学、气候变化、金融、生态水文等领域,帮助研究者识别系统状态或过程发生转变的时间及其可能原因。
核心思想:
变化点分析的目标是识别时间序列数据的一个或多个位置,在这些位置数据的均值、方差、分布或趋势等属性发生显著改变。这些变化可能是由于外部条件的改变(如气候变化、政策干预)或系统内部的变化(如生态水文循环状态的转变)引起的。
案例:
Ge et al.,2024利用变化点分析了博斯腾湖水位和面积的年际变化。CPA分析得出两个趋势变化点,将曲线变化分成三段。
CPA实现方法:
ruptures :这是一个专门用于变化点检测的Python库,提供了多种算法。github地址:ruptures
changefinder :这个库主要用于时间序列数据的变化点检测。
PELT (Pruned Exact Linear Time):这是一种高效的多变化点检测算法。
Bayesian Changepoint Detection :基于贝叶斯方法的变化点检测。
代码实现
这里使用ruptures库实现一个简单的示例,更多的内容可以参考其文档
import numpy as np
import matplotlib.pyplot as plt
import ruptures as rpt
# 生成示例数据
np.random.seed(42)
n_samples = 200
signal = np.concatenate([np.random.normal(0, 1, 100), np.random.normal(5, 1, 100)])
# 绘制原始数据
plt.figure(figsize=(8, 2))
plt.plot(signal, label='Original Signal')
plt.title('Original Signal with Change Points')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()
# 使用Pelt算法检测变化点
model = "l2" # 选择模型,这里使用L2范数
algo = rpt.Pelt(model=model).fit(signal)
result = algo.predict(pen=10) # pen是惩罚参数,用于控制变化点的数量
# 绘制检测到的变化点
rpt.display(signal, result, figsize=(8, 2))
plt.title('Change Points Detected')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()
# 打印检测到的变化点
print("Detected change points:", result)
结果显示:
Detected change points: [100, 200]
原始数据
监测到变化点的图
参考文献
Ge X, Ding J, Amantai N, Xiong J and Wang J (2024) Responses of vegetation cover to hydro-climatic variations in Bosten Lake Watershed, NW China. Front. Plant Sci. 15:1323445. doi: 10.3389/fpls.2024.1323445