60天python訓練計劃----day59

????????在之前的學習中,我們層層遞進的介紹了時序模型的發展,從AR到MA到ARMA,再到ARIMA。本質就是把數據處理的操作和模型結合在一起了,實際上昨天提到的季節性差分也可以合并到模型中,讓流程變得更加統一。

季節性差分用S來表示,所以這個模型叫做SARIMA模型

一、SARIMA模型

????????SARIMA (Seasonal AutoRegressive Integrated Moving Average)是標準ARIMA模型的擴展。它專門用于處理具有明顯季節性模式的時間序列數據。????????

????????可以把SARIMA想象成一個“雙核”的ARIMA模型:

1. 一個非季節性核心,用來處理數據的整體趨勢。

2. 一個季節性核心,用來處理數據中的周期性模式。

1.1 SARIMA模型的參數

SARIMA模型由兩組參數定義:(p,d,q) 和 (P,D,Q,m)

ps:注意大小寫

1. 非季節性部分: (p, d, q) 這里和之前arima一致

2. 季節性部分: (P, D, Q, m),這是一套全新的參數 (P, D, Q, m)。它負責處理序列的長期、周期性的依賴關系。

標準寫法 SARIMA(p, d, q)(P, D, Q)m

這里之所以m單獨拿出來,為了在概念上強調 m 的獨特性

m 是舞臺,P,D,Q 是演員

m 定義了季節性的“舞臺”有多大。它不是一個需要通過模型擬合來“學習”的階數,而是數據本身固有的、預先定義的結構性屬性。m可以理解為季節周期。

在分析數據之初,我們通過觀察或業務常識就能確定m。看到月度數據,我們立刻知道m=12;看到季度數據,我們知道m=4。

m 告訴模型:“你要關注的周期性規律是每隔m個時間點重復一次的。” 它為季節性核心 (P, D, Q) 的所有運算提供了基準尺度。


?

(P, D, Q)季節性階數,它們描述了在這個季節性尺度上,模型的具體行為。

- P: 在m的尺度上,需要看過去幾個季節的自己?(y_{t-m}, y_{t-2m}, …)

- D: 在m的尺度上,需要做幾次差分?(y_t - y_{t-m})

- Q: 在m的尺度上,需要看過去幾個季節的誤差?(error_{t-m}, error_{t-2m}, …)

這些階數通常需要通過分析季節性差分后的ACF/PACF圖來確定。

這里我們強調下(p,d,q)和(P,D,Q)的區別。差別在于它們看的不是上一個時間點,而是上一個季節的同一時間點。

普通差分 (d) 是 y_t - y_{t-1} (今天 - 昨天)。季節性差分 (D) 是 y_t - y_{t-m} (今年8月 - 去年8月)。

它的作用是消除季節性帶來的增長趨勢,讓季節性數據變得平穩。如果用電量每年夏天都比上一年夏天高,D=1就能消除這個影響。

普通AR (p) 認為 y_t 和 y_{t-1}, y_{t-2}… 相關。季節性AR (P) 認為 y_t 和 y_{t-m}, y_{t-2m}… 相關。也就是說,模型認為今年8月的用電量和去年8月、前年8月的用電量有直接關系。

普通MA (q) 認為 y_t 的誤差和 t-1, t-2 時刻的誤差相關。季節性MA (Q) 認為 y_t 的誤差和 t-m, t-2m 時刻的誤差相關。也就是說,模型認為對今年8月的預測誤差,可以根據去年8月、前年8月的預測誤差來進行修正。

總結:季節性階數是對比不同季節的同一時刻的差別。

1.2 SARIMA模型的理解
?

sarima不是單純的對arima做了一次季節差分,而且做了季節性的一些其他特征捕捉:季節自回歸P、季節移動平均Q。

SARIMA的完整工作流是這樣的:

1. 季節性層面分析:模型首先利用 (P, D, Q)m 這一套完整的“季節性ARIMA”來處理數據。它進行季節性差分(D),然后用季節性自回歸(P)和季節性移動平均(Q)來解釋季節性平穩后的數據中的模式。這個過程的輸出是一個“季節性影響被剝離后”的殘差序列。

2. 非季節性層面分析:接著,模型再將我們熟悉的 (p, d, q) 應用于第一步產生的殘差序列上。它對這個序列進行普通差分(d),然后用AR(p)和MA(q)來捕捉其中剩余的、短期的、非季節性的模式。

總結:SARIMA不是在ARIMA上打個補丁,而是構建了一個與非季節性部分 (p,d,q) 平行且完整的季節性分析系統 (P,D,Q)m。這兩個系統協同工作,一個負責宏觀的、周期性的規律,另一個負責微觀的、短期的波動,最終結合成一個強大而全面的預測模型。

1.3 SARIMA實戰

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
warnings.filterwarnings('ignore')
# 顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1. 加載數據
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
df = pd.read_csv(url, header=0, index_col=0, parse_dates=True)
df.columns = ['Passengers']# 2. 劃分訓練集和測試集(保留最后12個月作為測試)
train_data = df.iloc[:-12]
test_data = df.iloc[-12:]print("--- 訓練集 ---")
print(train_data.tail()) # 觀察訓練集最后5行
print("\n--- 測試集 ---")
print(test_data.head()) # 觀察測試集前5行# 3. 可視化原始數據
plt.figure(figsize=(12, 6))
plt.plot(train_data['Passengers'], label='訓練集')
plt.plot(test_data['Passengers'], label='測試集', color='orange')
plt.title('國際航空乘客數量 (1949-1960)')
plt.xlabel('年份')
plt.ylabel('乘客數量 (千人)')
plt.legend()
plt.show()# 進行季節性差分 (D=1, m=12)
seasonal_diff = df['Passengers'].diff(12).dropna()
# 再進行普通差分 (d=1)
seasonal_and_regular_diff = seasonal_diff.diff(1).dropna()# 繪制差分后的數據
plt.figure(figsize=(12, 6))
plt.plot(seasonal_and_regular_diff)
plt.title('經過一次季節性差分和一次普通差分后的數據')
plt.show()# ADF檢驗
result = adfuller(seasonal_and_regular_diff)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}') # p-value越小,越說明數據平穩# 繪制ACF和PACF圖
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(seasonal_and_regular_diff, lags=36, ax=ax1) # 繪制36個時間點
plot_pacf(seasonal_and_regular_diff, lags=36, ax=ax2)
plt.show()from pmdarima import auto_arima # 一個方便的自動調參庫
# 使用auto_arima自動尋找最優模型
# 我們告訴它d=1, D=1, m=12是固定的,讓它去尋找p,q,P,Q的最優組合
# 默認使用AIC作為評估標準
auto_model = auto_arima(train_data['Passengers'],start_p=0, start_q=0,max_p=2, max_q=2,m=12,start_P=0, seasonal=True,d=1, D=1,trace=True,error_action='ignore',suppress_warnings=True,stepwise=True)print(auto_model.summary())# 從auto_arima的結果中獲取最優參數best_order = auto_model.order
best_seasonal_order = auto_model.seasonal_order# 擬合模型
model = SARIMAX(train_data['Passengers'],order=best_order,seasonal_order=best_seasonal_order)
results = model.fit(disp=False)# 打印模型診斷圖
results.plot_diagnostics(figsize=(15, 12))
plt.show()# 預測未來12個點
predictions = results.get_prediction(start=test_data.index[0], end=test_data.index[-1])
pred_mean = predictions.predicted_mean # 預測均值
pred_ci = predictions.conf_int() # 預測的置信區間# 繪制預測結果
plt.figure(figsize=(12, 6))
plt.plot(df['Passengers'], label='原始數據')
plt.plot(pred_mean, label='SARIMA 預測', color='red')
plt.fill_between(pred_ci.index,pred_ci.iloc[:, 0],pred_ci.iloc[:, 1], color='pink', alpha=0.5, label='置信區間')
plt.title('SARIMA模型預測 vs. 真實值')
plt.xlabel('年份')
plt.ylabel('乘客數量 (千人)')
plt.legend()
plt.show()

@浙大疏錦行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913160.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913160.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913160.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習日志05 python

我相信事在人為,人定勝天,現在還是在基礎語法上面打轉,還是會提出一些很低級的很基礎的問題,不要著急,波浪式前進、螺旋式上升的過程吧,雖然現在的確是很絕望吧...... 今天要做一個練習:編寫猜…

LiteHub中間件之gzip算法

gzip算法理論部分LZ777算法霍夫曼編碼算法改進型的LZ777算法代碼實現壓縮對象gzip實現運行分析日志查看wireshark抓包查看后臺管理界面查看理論部分 gzip是一種無損壓縮算法,其基礎為Deflate,Deflate是LZ77與哈弗曼編碼的一個組合體。它的基本原理是&…

java+vue+SpringBoo校園失物招領網站(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔(1萬字以上)開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言:后端:Java 前端:vue框架:springboot數據庫:mysql 開發工具 JDK版本:JDK1.…

Qt Quick 與 QML(五)qml中的布局

QML布局系統主要分為三大類:錨布局、定位器布局、布局管理器。一、錨布局(Anchors)通過定義元素與其他元素或父容器的錨點關系實現精確定位,支持動態調整。核心特性屬性??作用??示例?anchors.left左邊緣對齊目標元素anchors.…

【Java|集合類】list遍歷的6種方式

本文主要是總結一下Java集合類中List接口的遍歷方式&#xff0c;以下面的list為例&#xff0c;為大家講解遍歷list的6種方式。 List<Integer> list new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);文章目錄1.直接輸出2.for循環遍…

博弈論基礎-筆記

取石子1 性質一&#xff1a;12345可以確定先手贏&#xff0c;6不論取那個質數都輸&#xff0c;789 10 11可以分別取12345變成6 性質二&#xff1a;6的倍數一定不能取出之后還是6的倍數&#xff08;不能轉換輸態&#xff09; #include <bits/stdc.h> using namespace st…

多任務學習-ESMM

簡介 ESMM&#xff08;Entire Space Multi-task Model&#xff09;是2018年阿里巴巴提出的多任務學習模型。基于共享的特征表達和在用戶整個行為序列空間上的特征提取實現對CTR、CVR的聯合訓練 解決的問題 SSB&#xff08;sample selection bias&#xff09; 如下圖1所示&am…

K8S 集群配置踩坑記錄

系統版本&#xff1a;Ubuntu 22.04.5-live-server-amd64 K8S 版本&#xff1a;v1.28.2 Containerd 版本&#xff1a; 1.7.27 kubelet logs kuberuntime_sandbox.go:72] "Failed to create sandbox for pod" err"rpc error: code Unknown desc failed to cre…

超濾管使用與操作流程-實驗操作013

超濾管使用與操作流程 超濾管&#xff08;或蛋白濃縮管&#xff09;是一種重要的實驗設備&#xff0c;廣泛應用于分離與純化大分子物質&#xff0c;尤其是蛋白質、多糖和核酸等。其工作原理依賴于超濾技術&#xff0c;通過半透膜對分子進行篩分&#xff0c;精準地將大分子物質…

GitHub已破4.5w star,從“零樣本”到“少樣本”TTS,5秒克隆聲音,沖擊傳統錄音棚!

嗨&#xff0c;我是小華同學&#xff0c;專注解鎖高效工作與前沿AI工具&#xff01;每日精選開源技術、實戰技巧&#xff0c;助你省時50%、領先他人一步。&#x1f449;免費訂閱&#xff0c;與10萬技術人共享升級秘籍&#xff01;你是否為錄音成本高、聲音不靈活、又想為多語言…

【中文核心期刊推薦】《遙感信息》

《遙感信息》&#xff08;CN&#xff1a;11-5443/P&#xff09;是一份具有較高學術價值的雙月刊期刊&#xff0c;自創刊以來&#xff0c;憑借新穎的選題和廣泛的報道范圍&#xff0c;兼顧了大眾服務和理論深度&#xff0c;深受學術界和廣大讀者的關注與好評。 該期刊創辦于1986…

uniapp微信小程序css中background-image失效問題

項目場景&#xff1a;提示&#xff1a;這里簡述項目相關背景&#xff1a;在用uniapp做微信小程序的時候&#xff0c;需要一張背景圖&#xff0c;用的是當時做app的時候的框架&#xff0c;但是&#xff0c;在class的樣式中background-image失效了&#xff0c;查了后才知道&#…

iOS App無源碼安全加固實戰:如何對成品IPA實現結構混淆與資源保護

在很多iOS項目交付中&#xff0c;開發者或甲方并不總能拿到應用源碼。例如外包項目交付成品包、歷史項目維護、或者僅負責分發渠道的中間商&#xff0c;都需要在拿到成品ipa文件后對其進行安全加固。然而傳統的源碼級混淆方法&#xff08;如LLVM Obfuscator、Swift Obfuscator&…

Java 中的 ArrayList 和 LinkedList 區別詳解(源碼級理解)

&#x1f680; Java 中的 ArrayList 和 LinkedList 區別詳解&#xff08;源碼級理解&#xff09; 在日常 Java 開發中&#xff0c;ArrayList 和 LinkedList 是我們經常用到的兩種 List 實現。雖然它們都實現了 List 接口&#xff0c;但在底層結構、訪問效率、插入/刪除操作、擴…

使用OpenLayers調用geoserver發布的wms服務

1.前端vue3調用代碼 <template><div><div ref"mapContainer" class"map"></div></div> </template><script setup lang"ts"> import { ref, onMounted } from "vue"; import Map from &quo…

二十七、【測試執行篇】測試計劃:前端一鍵觸發測試 實時狀態追蹤

二十七、【測試執行篇】測試計劃:前端一鍵觸發測試 & 實時狀態追蹤 前言準備工作第一部分:后端 API 確認第二部分:前端實現 - 觸發執行與狀態輪詢第三部分:后端 API 增強第四部分:全面測試總結前言 一個完整的自動化測試流程,從測試用例的創建到報告的生成,最終都需…

60天python訓練營打卡day52

學習目標&#xff1a; 60天python訓練營打卡 學習內容&#xff1a; DAY 52 神經網絡調參指南 知識點回顧&#xff1a; 1.隨機種子 2.內參的初始化 3.神經網絡調參指南 a.參數的分類 b.調參的順序 c.各部分參數的調整心得 作業&#xff1a;對于day’41的簡單cnn&#xff0c;看…

【Modern C++ Part3】Understand-decltype

條款三&#xff1a;理解decltype decltype是一個怪異的發明。給定一個變量名或者表達式&#xff0c;decltype會告訴你這個變量名或表達式的類型。decltype的返回的類型往往也是你期望的。然而有時候&#xff0c;它提供的結果會使開發者極度抓狂而不得參考其他文獻或者在線的Q&…

前端批量請求場景

文章目錄 一、批量請求1、Promise.allSettled2、返回值穿透 二、案例1、 批量任務2、緩存優化3、另一種實現方式 一般時候前端都是簡單的查詢任務&#xff0c;復雜的數據獲取都是后臺處理好再返回&#xff0c;如果遇到接口流程化處理、數據組裝&#xff0c;可以參考一下。 一、…

芊芊妙音:智能變聲,玩轉聲音魔法

在當今豐富多彩的社交和娛樂環境中&#xff0c;聲音的魅力正逐漸被更多人發現和利用。無論是線上社交、短視頻創作還是直播互動&#xff0c;一個獨特而有趣的聲音總能讓人眼前一亮&#xff0c;甚至成為個人風格的一部分。《芊芊妙音》正是這樣一款能夠幫助用戶輕松實現聲音變換…