自回歸就是通過前幾天的數據來預測今天的值,類似于“靠前幾天的自己,來預測今天的自己”。

3. 滑動平均(Moving Average,簡稱MA)

滑動平均就是用之前的“誤差”來調整當前的預測。

再用午飯花費舉例:假設你每天都會做預算,但有時會因為一些突發情況(比如今天特別餓,或者看到喜歡的菜)而多花了錢。這些“意外的誤差”會影響你接下來的花費。

滑動平均的公式看起來是這樣的:

滑動平均就是利用之前“預算偏差”來調整今天的預算,類似于“回顧前幾天的誤差,來修正今天的自己”。

4. 自回歸滑動平均模型(ARMA)

現在,我們來把「自回歸」和「滑動平均」結合起來。ARMA 模型就是在用前幾天的數值(自回歸)做預測的同時,還考慮到之前誤差的影響(滑動平均),得到一個更準確的預測模型。

公式表示

通過 ARMA 模型,我們既利用了過去的數據趨勢(自回歸),也參考了之前的誤差(滑動平均),讓預測更接近真實情況。

舉個簡單的小例子

假設我們記錄了過去幾天的氣溫變化,發現今天的氣溫和前兩天的氣溫(自回歸部分)以及前一天的誤差(滑動平均部分)有關。

假設:

這樣,我們就得到了一個基于 ARMA 模型的預測。

事實上,ARMA 模型是一種結合自回歸和滑動平均的方法,能夠利用歷史數據的趨勢和誤差去預測未來值。

下面,咱們從原理和案例方面再來和大家聊聊~

ARMA 模型

ARMA 模型結合了兩部分:自回歸 (AR) 和 滑動平均 (MA)。

假設:

1. 自回歸部分 (AR)

自回歸模型通過先前的序列值來預測當前值,公式為:

2. 滑動平均部分 (MA)

滑動平均模型使用過去的誤差項預測當前值:

3. 綜合 AR 和 MA

綜合 AR 和 MA 兩部分后,得到 ARMA 模型公式:

數據集選擇和下載

我們在 Kaggle 上選擇一個合適的時間序列數據集,如「每日溫度」、「股票價格」等。之后手動實現 ARMA 模型并通過圖表展示分析結果。

Python實現

首先,咱們使用?daily-min-temperatures.csv?數據集。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 讀取數據集
data = pd.read_csv('daily-min-temperatures.csv', parse_dates=['Date'], index_col='Date')
temperature = data['Temp'].values

# 繪制時間序列圖
plt.figure(figsize=(10, 6))
plt.plot(data.index, temperature, color='dodgerblue')
plt.title("Daily Minimum Temperatures")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.show()

# 繪制自相關和偏自相關圖
plt.figure(figsize=(12, 5))
plt.subplot(121)
plot_acf(temperature, lags=30, color='blue', ax=plt.gca())
plt.title("Autocorrelation (ACF)")

plt.subplot(122)
plot_pacf(temperature, lags=30, color='red', ax=plt.gca())
plt.title("Partial Autocorrelation (PACF)")
plt.tight_layout()
plt.show()

# 初始化ARMA模型參數
p, q = 2, 2 # 設置自回歸和滑動平均的階數
phi = np.random.randn(p)
theta = np.random.randn(q)
mu = np.mean(temperature)
n = len(temperature)

# 自定義 ARMA 模型擬合函數
def arma_model(temperature, phi, theta, p, q):
Y_pred = np.zeros(n)
residuals = np.zeros(n)

for t in range(max(p, q), n):
ar_term = np.sum([phi[i] * temperature[t - i - 1] for i in range(p)])
ma_term = np.sum([theta[i] * residuals[t - i - 1] for i in range(q)])
Y_pred[t] = mu + ar_term + ma_term
residuals[t] = temperature[t] - Y_pred[t] # 計算殘差
return Y_pred, residuals

# 預測并計算殘差
Y_pred, residuals = arma_model(temperature, phi, theta, p, q)

# 繪制擬合效果圖
plt.figure(figsize=(10, 6))
plt.plot(data.index, temperature, label="Original", color='dodgerblue')
plt.plot(data.index, Y_pred, label="ARMA Fit", color='coral')
plt.title("ARMA Model Fitting")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.legend()
plt.show()

# 繪制殘差圖
plt.figure(figsize=(10, 6))
plt.plot(data.index, residuals, color='purple')
plt.title("Residuals of ARMA Model")
plt.xlabel("Date")
plt.ylabel("Residuals")
plt.show()

1. 時間序列原始數據圖:展示溫度隨時間的變化趨勢,分析季節性和周期性。

2. 自相關圖?(ACF):展示滯后值與當前值的關系,幫助決定 AR 模型階數。

3. 偏自相關圖?(PACF):觀察自回歸的影響,幫助選擇 AR 部分的階數。

4. 殘差圖:觀察 ARMA 模型殘差的分布是否隨機,驗證模型的擬合效果。

最后

通過手動實現 ARMA 模型,可以深刻理解其數學推導和實現細節,同時通過圖形直觀地理解模型的擬合效果和殘差分布。

文章轉自微信公眾號@深夜努力寫Python

上一篇:

突破最強集成算法模型,Adaboost!!

下一篇:

突破最強時間序列模型,移動平均!!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費