
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
自回歸就是通過前幾天的數據來預測今天的值,類似于“靠前幾天的自己,來預測今天的自己”。
滑動平均就是用之前的“誤差”來調整當前的預測。
再用午飯花費舉例:假設你每天都會做預算,但有時會因為一些突發情況(比如今天特別餓,或者看到喜歡的菜)而多花了錢。這些“意外的誤差”會影響你接下來的花費。
滑動平均的公式看起來是這樣的:
滑動平均就是利用之前“預算偏差”來調整今天的預算,類似于“回顧前幾天的誤差,來修正今天的自己”。
現在,我們來把「自回歸」和「滑動平均」結合起來。ARMA 模型就是在用前幾天的數值(自回歸)做預測的同時,還考慮到之前誤差的影響(滑動平均),得到一個更準確的預測模型。
公式表示:
通過 ARMA 模型,我們既利用了過去的數據趨勢(自回歸),也參考了之前的誤差(滑動平均),讓預測更接近真實情況。
假設我們記錄了過去幾天的氣溫變化,發現今天的氣溫和前兩天的氣溫(自回歸部分)以及前一天的誤差(滑動平均部分)有關。
假設:
這樣,我們就得到了一個基于 ARMA 模型的預測。
事實上,ARMA 模型是一種結合自回歸和滑動平均的方法,能夠利用歷史數據的趨勢和誤差去預測未來值。
下面,咱們從原理和案例方面再來和大家聊聊~
ARMA 模型結合了兩部分:自回歸 (AR) 和 滑動平均 (MA)。
假設:
自回歸模型通過先前的序列值來預測當前值,公式為:
滑動平均模型使用過去的誤差項預測當前值:
綜合 AR 和 MA 兩部分后,得到 ARMA 模型公式:
我們在 Kaggle 上選擇一個合適的時間序列數據集,如「每日溫度」、「股票價格」等。之后手動實現 ARMA 模型并通過圖表展示分析結果。
首先,咱們使用?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 模型,可以深刻理解其數學推導和實現細節,同時通過圖形直觀地理解模型的擬合效果和殘差分布。