鍵.png)
如何高效爬取全球新聞網(wǎng)站 – 整合Scrapy、Selenium與Mediastack API實(shí)現(xiàn)自動(dòng)化新聞采集
自回歸就是通過前幾天的數(shù)據(jù)來預(yù)測今天的值,類似于“靠前幾天的自己,來預(yù)測今天的自己”。
滑動(dòng)平均就是用之前的“誤差”來調(diào)整當(dāng)前的預(yù)測。
再用午飯花費(fèi)舉例:假設(shè)你每天都會(huì)做預(yù)算,但有時(shí)會(huì)因?yàn)橐恍┩话l(fā)情況(比如今天特別餓,或者看到喜歡的菜)而多花了錢。這些“意外的誤差”會(huì)影響你接下來的花費(fèi)。
滑動(dòng)平均的公式看起來是這樣的:
滑動(dòng)平均就是利用之前“預(yù)算偏差”來調(diào)整今天的預(yù)算,類似于“回顧前幾天的誤差,來修正今天的自己”。
現(xiàn)在,我們來把「自回歸」和「滑動(dòng)平均」結(jié)合起來。ARMA 模型就是在用前幾天的數(shù)值(自回歸)做預(yù)測的同時(shí),還考慮到之前誤差的影響(滑動(dòng)平均),得到一個(gè)更準(zhǔn)確的預(yù)測模型。
公式表示:
通過 ARMA 模型,我們既利用了過去的數(shù)據(jù)趨勢(自回歸),也參考了之前的誤差(滑動(dòng)平均),讓預(yù)測更接近真實(shí)情況。
假設(shè)我們記錄了過去幾天的氣溫變化,發(fā)現(xiàn)今天的氣溫和前兩天的氣溫(自回歸部分)以及前一天的誤差(滑動(dòng)平均部分)有關(guān)。
假設(shè):
這樣,我們就得到了一個(gè)基于 ARMA 模型的預(yù)測。
事實(shí)上,ARMA 模型是一種結(jié)合自回歸和滑動(dòng)平均的方法,能夠利用歷史數(shù)據(jù)的趨勢和誤差去預(yù)測未來值。
下面,咱們從原理和案例方面再來和大家聊聊~
ARMA 模型結(jié)合了兩部分:自回歸 (AR) 和 滑動(dòng)平均 (MA)。
假設(shè):
自回歸模型通過先前的序列值來預(yù)測當(dāng)前值,公式為:
滑動(dòng)平均模型使用過去的誤差項(xiàng)預(yù)測當(dāng)前值:
綜合 AR 和 MA 兩部分后,得到 ARMA 模型公式:
我們在 Kaggle 上選擇一個(gè)合適的時(shí)間序列數(shù)據(jù)集,如「每日溫度」、「股票價(jià)格」等。之后手動(dòng)實(shí)現(xiàn) ARMA 模型并通過圖表展示分析結(jié)果。
首先,咱們使用?daily-min-temperatures.csv
?數(shù)據(jù)集。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 讀取數(shù)據(jù)集
data = pd.read_csv('daily-min-temperatures.csv', parse_dates=['Date'], index_col='Date')
temperature = data['Temp'].values
# 繪制時(shí)間序列圖
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()
# 繪制自相關(guān)和偏自相關(guān)圖
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模型參數(shù)
p, q = 2, 2 # 設(shè)置自回歸和滑動(dòng)平均的階數(shù)
phi = np.random.randn(p)
theta = np.random.randn(q)
mu = np.mean(temperature)
n = len(temperature)
# 自定義 ARMA 模型擬合函數(shù)
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] # 計(jì)算殘差
return Y_pred, residuals
# 預(yù)測并計(jì)算殘差
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. 時(shí)間序列原始數(shù)據(jù)圖:展示溫度隨時(shí)間的變化趨勢,分析季節(jié)性和周期性。
2. 自相關(guān)圖?(ACF):展示滯后值與當(dāng)前值的關(guān)系,幫助決定 AR 模型階數(shù)。
3. 偏自相關(guān)圖?(PACF):觀察自回歸的影響,幫助選擇 AR 部分的階數(shù)。
4. 殘差圖:觀察 ARMA 模型殘差的分布是否隨機(jī),驗(yàn)證模型的擬合效果。
通過手動(dòng)實(shí)現(xiàn) ARMA 模型,可以深刻理解其數(shù)學(xué)推導(dǎo)和實(shí)現(xiàn)細(xì)節(jié),同時(shí)通過圖形直觀地理解模型的擬合效果和殘差分布。
文章轉(zhuǎn)自微信公眾號@深夜努力寫Python