【python深度学习】Day 56 时序数据的检验

知识点:

  1. 假设检验基础知识
    1. 原假设与备择假设
    2. P值、统计量、显著水平、置信区间
  2. 白噪声
    1. 白噪声的定义
    2. 自相关性检验:ACF检验和Ljung-Box 检验
    3. 偏自相关性检验:PACF检验
  3. 平稳性
    1. 平稳性的定义
    2. 单位根检验
  4. 季节性检验
    1. ACF检验
    2. 序列分解:趋势+季节性+残差

记忆口诀:p越小,落在置信区间外,越拒绝原假设。

时序部分需要铺垫的知识非常多,相信这次应该说清楚了假设检验相关的基础知识。

**作业:**自行构造数据集,来检查是否符合这个要求。

时间数据的检验流程,如下

一、假设检验

统计学中,假设检验:证明一件事,不直接去证明它'是',而先假设它'不是',然后用证据去推翻这个'不是'的假设。

1.原假设和备择假设

根据序列预测对数据的要求,先进行检验,确定后续选择什么操作。

2 P值与统计量

p值:证明统计量是否有价值的关键指标

置信区间:

-落在置信区间内 = 我们观测到的现象很可能是在 原假设为真的情况下,纯属巧合发生的= 接受原假设

  • 落在置信区间外 = 备择假设证据确凿,不是巧合

二、白噪声

1.定义

一个完全随机的序列(其特点是具有不可预测性)

白噪声满足以下条件:

(1)均值为0

(2)方差恒定

(3)自相关性为0(即过去的值对未来的值没有影响)

在结构化数据集中预测(样本独立无关),如果数据本身就没价值,比如特征和样本毫无关系,虽然生成一些随机数作为特征,再随机生成一些数作标签后,可以训练,但是模型注定也学不到什么东西。

时序预测中,要求会更加苛刻,自己制造一个随机的序列,然后让模型来学习,这注定也是不可能实现的。也就是说数据本身要具备可预测性

2.判断是否为白噪声的方法

(1)ACF 检验

ACF 假设的是在滞后 k 阶上,序列的自相关系数为 0

(2)PACF检验

PACF假设:k 阶偏自相关系数为 0,这句话的意思是控制了中间所有滞后项(y (t-1), y (t-2), ..., y (t-k+1))的影响后,y (t) 与 y (t-k) 之间无直接线性关联

  • ACF (自相关):衡量 y(t) 和 y(t-k) 之间的总体相关性,包含了所有中间时刻(t-1, t-2, ...)的间接影响。

  • PACF (偏自相关):衡量 y(t) 和 y(t-k) 之间的直接相关性,剔除了所有中间时刻的干扰。

(3)Ljung-Box检验

评估整个数据(比如前10个或前20个滞后项)的整体表现

三、平稳性

1.定义

一组数据的均值,方差不会随时间改变而改变

2.判断是否具有平稳性的方法------ADF检验

ADF检验的两个假设和判断规则:

原假设 (H₀): 序列是非平稳的(存在单位根)。

备择假设 (H₁): 序列是平稳的。

判断规则: 我们主要看输出的 p-value。

  • 如果 p-value < 0.05:我们有充分的理由拒绝原假设,采纳备择假设,即认为序列是平稳的。

  • 如果 p-value ≥ 0.05:我们无法拒绝原假设,即认为序列是非平稳的。

三、季节性

1.定义

时间序列中,以固定的、已知的频率重复出现的模式或周期性波动

季节性是数据中最强大、最明显的预测信号之一。如果一个模型不能识别和利用季节性,它的预测结果将会出现系统性的、周期性的巨大误差。

四、代码实战

1.生成随机序列

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 中文显示设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

# --- 1. 生成随机序列数据 ---

# 为了让每次运行的结果都一样,设置一个随机种子(可选)
np.random.seed(42)

# 定义序列的长度
num_points = 200

# 生成一个包含 200 个点的随机序列
# np.random.randn() 从标准正态分布(均值为0,方差为1)中抽取随机样本
random_sequence = np.random.randn(num_points)

print("生成的前10个数据点:")
print(random_sequence[:10])


# --- 2. 可视化序列 ---

# 设置图形大小
plt.figure(figsize=(12, 6))

# 绘制线图
plt.plot(random_sequence, label='Random Sequence (White Noise)')

# 添加标题和标签
plt.title('Visualization of a Randomly Generated Sequence', fontsize=16)
plt.xlabel('Time Step (时间步)', fontsize=12)
plt.ylabel('Value (值)', fontsize=12)

# 添加一条水平线,表示序列的均值(接近于0)
plt.axhline(y=0, color='r', linestyle='--', label='Mean (均值 ≈ 0)')

# 显示网格和图例
plt.grid(True, linestyle='--', alpha=0.6)
plt.legend()

# 显示图形
plt.show()

2.绘制ACF检验图

python 复制代码
from statsmodels.graphics.tsaplots import plot_acf 
print("--- 开始检验白噪声属性 ---")

# 检验 1: 均值是否接近 0
mean = np.mean(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
if -0.1 < mean < 0.1:
    print("   (结论: 均值非常接近0,满足条件。)\n")
else:
    print("   (结论: 均值偏离0较远。)\n")

# 检验 2: 方差是否恒定(且接近理论值1)
# 对于我们生成的数据,方差恒定是与生俱来的。我们主要检查其值。
variance = np.var(random_sequence)
print(f"2. 序列的方差: {variance:.4f}")
if 0.8 < variance < 1.2:
    print("   (结论: 方差接近于1,满足条件。np.random.randn理论方差为1)\n")
else:
    print("   (结论: 方差偏离1较远。)\n")


# 检验 3: 自相关性是否为 0
# 这是最核心的检验。我们通过绘制ACF图来完成。
print("3. 检验自相关性 (使用ACF图):")
print("   - ACF图展示了序列与它过去值之间的相关性。")
print("   - 对于白噪声,只有lag=0时相关性为1,其他所有lag的相关性都应在蓝色置信区间内(统计上不显著)。")

# 创建一个新的图形来绘制ACF图
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax) # 我们查看前30个滞后的相关性
ax.set_title('序列的自相关函数图 (ACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Autocorrelation (自相关系数)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

3.绘制PACF检验图

python 复制代码
from statsmodels.graphics.tsaplots import plot_pacf # 引入PACF图
# --- 绘制PACF图 ---
fig, ax = plt.subplots(figsize=(12, 5))
plot_pacf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的偏自相关函数图 (PACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Partial Autocorrelation')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

4.绘制Ljung-Box检验图

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# 引入Ljung-Box检验的函数
from statsmodels.stats.diagnostic import acorr_ljungbox 

# --- 您的原始代码部分 ---
np.random.seed(42)
num_points = 200
random_sequence = np.random.randn(num_points)

# --- 白噪声属性检验---
mean = np.mean(random_sequence)
variance = np.var(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
print(f"2. 序列的方差: {variance:.4f}\n")
print("3. 检验自相关性 (使用ACF图)...")
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的自相关函数图 (ACF Plot)')
plt.show()

# --- 新增:使用 Ljung-Box 检验进行严格的白噪声检验 ---
print("\n" + "="*50)
print("4. 进行严格的白噪声检验 (Ljung-Box Test)")
print("="*50)
print("   - 原假设(H₀): 序列是白噪声。")
print("   - 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。")

# 执行Ljung-Box检验
# 我们通常会检查一系列的滞后项,比如前10、20、30个
# 函数返回一个包含统计量和p值的DataFrame
ljung_box_result = acorr_ljungbox(random_sequence, lags=[10, 20, 30], return_df=True)

print("\nLjung-Box检验结果:")
print(ljung_box_result)

# --- 结论解释 ---
print("\n--- 检验结论 ---")
# 我们可以检查最后一个(最严格的)p值
# .iloc[-1] 获取最后一行, .loc['lb_pvalue'] 获取p值
last_p_value = ljung_box_result.iloc[-1]['lb_pvalue']

if last_p_value < 0.05:
    print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 小于 0.05。")
    print("结论:我们拒绝原假设,该序列不是白噪声。")
else:
    print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 大于 0.05。")
    print("结论:我们无法拒绝原假设,该序列是白噪声。")
相关推荐
文心快码BaiduComate29 分钟前
百度云与光本位签署战略合作:用AI Agent 重构芯片研发流程
前端·人工智能·架构
风象南1 小时前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
曲幽2 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
Mintopia2 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮2 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬3 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia3 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区3 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两6 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
敏编程6 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python