在時序預(yù)測中,常用的方法包括以下幾種:
F.長短期記憶網(wǎng)絡(luò)(LSTM) 下面我將逐一展示每種方法的代碼示例: 1.移動平均法
import numpy as np# 創(chuàng)建時間序列數(shù)據(jù) data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 簡單平均法預(yù)測 def simple_average(data): return np.mean(data) prediction = simple_average(data)print (f'Simple Average Prediction: {prediction}' ) # 輸出: 19.0
(3)繪制實際數(shù)據(jù)和移動平均預(yù)測結(jié)果 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 生成模擬時間序列數(shù)據(jù) np.random.seed(0) date_rng = pd.date_range(start='2020-01-01' , end='2021-01-01' , freq='D' ) data = np.random.randn(len(date_rng)).cumsum()# 創(chuàng)建數(shù)據(jù)框 df = pd.DataFrame(date_rng, columns=['date' ]) df['data' ] = data df.set_index('date' , inplace=True)# 繪制生成的數(shù)據(jù) plt.figure(figsize=(12, 6)) plt.plot(df, label='Actual Data' ) plt.title('Simulated Time Series Data' ) plt.legend() plt.show()
2.指數(shù)平滑法
指數(shù)平滑法是一種常用的時間序列預(yù)測方法,通過對過去的數(shù)據(jù)進(jìn)行加權(quán)平均來預(yù)測未來的值,近期的數(shù)據(jù)權(quán)重較大。 import pandas as pd# 創(chuàng)建時間序列數(shù)據(jù) data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28] series = pd.Series(data)# 指數(shù)平滑法預(yù)測 alpha = 0.2 exp_smoothing = series.ewm(alpha=alpha).mean()print (exp_smoothing)
繪制實際數(shù)據(jù)和指數(shù)平滑法預(yù)測結(jié)果
3.自回歸(AR)模型
自回歸模型通過過去的值來預(yù)測未來的值。我們將使用statsmodels庫來實現(xiàn)AR模型。 from statsmodels.tsa.ar_model import AutoReg# 創(chuàng)建時間序列數(shù)據(jù) data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 自回歸模型預(yù)測 model = AutoReg(data, lags=1) model_fit = model.fit() prediction = model_fit.predict(len(data), len(data))print (f'AR Prediction: {prediction}' ) # 輸出預(yù)測結(jié)果
繪制實際數(shù)據(jù)和自回歸(AR)模型預(yù)測結(jié)果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg# 設(shè)置隨機(jī)種子以確??芍貜?fù)性 np.random.seed(42)# 生成模擬數(shù)據(jù) n = 200 # 數(shù)據(jù)點數(shù)量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 擬合自回歸模型 lags = 10 # 設(shè)置滯后階數(shù) model = AutoReg(data, lags=lags).fit()# 使用模型進(jìn)行預(yù)測 pred_start = n - lags # 預(yù)測起點 pred_end = n + 20 # 預(yù)測終點 pred = model.predict(start=pred_start, end=pred_end)# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='實際數(shù)據(jù)' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='AR模型預(yù)測' , color='red' ) plt.xlabel('時間' ) plt.ylabel('值' ) plt.legend() plt.title('實際數(shù)據(jù)與自回歸(AR)模型預(yù)測結(jié)果' ) plt.show()
上圖展示了生成的時間序列數(shù)據(jù)(藍(lán)色曲線)和自回歸(AR)模型的預(yù)測結(jié)果(紅色曲線).從圖中可以看到,AR模型較好地捕捉到了時間序列數(shù)據(jù)的變化趨勢. 4.滑動平均(MA)模型
滑動平均模型使用過去的誤差項來預(yù)測未來的值。 from statsmodels.tsa.arima.model import ARIMA# 創(chuàng)建時間序列數(shù)據(jù) data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 滑動平均模型預(yù)測 model = ARIMA(data, order=(0, 0, 1)) model_fit = model.fit() prediction = model_fit.forecast()print (f'MA Prediction: {prediction}' ) # 輸出預(yù)測結(jié)果
繪制實際數(shù)據(jù)和滑動平均(MA)模型預(yù)測結(jié)果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA# 設(shè)置隨機(jī)種子以確??芍貜?fù)性 np.random.seed(42)# 生成模擬數(shù)據(jù) n = 200 # 數(shù)據(jù)點數(shù)量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 擬合滑動平均模型 order = (0, 0, 10) # MA模型的階數(shù)為10 model = ARIMA(data, order=order).fit()# 使用模型進(jìn)行預(yù)測 pred_start = n # 預(yù)測起點 pred_end = n + 20 # 預(yù)測終點 pred = model.predict(start=pred_start, end=pred_end)# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='實際數(shù)據(jù)' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='MA模型預(yù)測' , color='red' ) plt.xlabel('時間' ) plt.ylabel('值' ) plt.legend() plt.title('實際數(shù)據(jù)與滑動平均(MA)模型預(yù)測結(jié)果' ) plt.show()
上圖展示了生成的時間序列數(shù)據(jù)(藍(lán)色曲線)和滑動平均(MA)模型的預(yù)測結(jié)果(紅色曲線).從圖中可以看到,MA模型較好地捕捉到了時間序列數(shù)據(jù)的變化趨勢. 5.自回歸滑動平均(ARMA)模型
Pip install statsmodels
然后導(dǎo)入
from statsmodels.tsa.arima.model import ARIMA# 創(chuàng)建時間序列數(shù)據(jù) data = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]# 自回歸滑動平均模型預(yù)測 model = ARIMA(data, order=(1, 0, 1)) model_fit = model.fit() prediction = model_fit.forecast()print (f'ARMA Prediction: {prediction}' ) # 輸出預(yù)測結(jié)果
繪制實際數(shù)據(jù)和和自回歸滑動平均(ARMA)模型預(yù)測結(jié)果
import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA# 設(shè)置隨機(jī)種子以確??芍貜?fù)性 np.random.seed(42)# 生成模擬數(shù)據(jù) n = 200 # 數(shù)據(jù)點數(shù)量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 擬合自回歸滑動平均(ARMA)模型 order = (2, 0, 2) # ARMA模型的階數(shù) model = ARIMA(data, order=order).fit()# 使用模型進(jìn)行預(yù)測 pred_start = n # 預(yù)測起點 pred_end = n + 20 # 預(yù)測終點 pred = model.predict(start=pred_start, end=pred_end)# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='實際數(shù)據(jù)' ) plt.plot(np.arange(pred_start, pred_end + 1), pred, label='ARMA模型預(yù)測' , color='red' ) plt.xlabel('時間' ) plt.ylabel('值' ) plt.legend() plt.title('實際數(shù)據(jù)與自回歸滑動平均(ARMA)模型預(yù)測結(jié)果' ) plt.show()
6.長短期記憶網(wǎng)絡(luò)(LSTM)
我們需要安裝TensorFlow庫.如果你的環(huán)境中沒有安裝,請運行以下命令進(jìn)行安裝: pip install tensorflow
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense# 設(shè)置隨機(jī)種子以確??芍貜?fù)性 np.random.seed(42) tf.random.set_seed(42)# 生成模擬數(shù)據(jù) n = 200 # 數(shù)據(jù)點數(shù)量 time = np.arange(n) data = 0.5 * np.sin(0.1 * time) + np.random.normal(size=n)# 準(zhǔn)備數(shù)據(jù)進(jìn)行訓(xùn)練 def create_dataset(data, time_step=1): X, Y = [], [] for i in range(len(data)-time_step-1): X.append(data[i:(i+time_step)]) Y.append(data[i + time_step]) return np.array(X), np.array(Y) time_step = 10 X, Y = create_dataset(data, time_step) X = X.reshape(X.shape[0], X.shape[1], 1)# 創(chuàng)建LSTM模型 model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1))) model.add(LSTM(50, return_sequences=False)) model.add(Dense(1)) model.compile(optimizer='adam' , loss='mean_squared_error' )# 訓(xùn)練模型 model.fit(X, Y, epochs=100, batch_size=1, verbose=0)# 進(jìn)行預(yù)測 train_predict = model.predict(X)# 使用模型預(yù)測未來的20個數(shù)據(jù)點 future_data = list(data[-time_step:]) future_preds = []for _ in range(20): future_input = np.array(future_data[-time_step:]).reshape(1, time_step, 1) future_pred = model.predict(future_input) future_data.append(future_pred[0][0]) future_preds.append(future_pred[0][0])# 繪制實際數(shù)據(jù)和預(yù)測結(jié)果 plt.figure(figsize=(12, 6)) plt.plot(time, data, label='實際數(shù)據(jù)' ) plt.plot(np.arange(time_step, len(train_predict) + time_step), train_predict, label='LSTM模型預(yù)測' , color='red' ) plt.plot(np.arange(n, n + 20), future_preds, label='LSTM模型未來預(yù)測' , color='green' ) plt.xlabel('時間' ) plt.ylabel('值' ) plt.legend() plt.title('實際數(shù)據(jù)與長短期記憶網(wǎng)絡(luò)(LSTM)模型預(yù)測結(jié)果' ) plt.show()
這些示例展示了常見的時序預(yù)測方法及其Python實現(xiàn).不同的方法適用于不同的數(shù)據(jù)和問題,選擇合適的方法是進(jìn)行準(zhǔn)確預(yù)測的關(guān)鍵.