LSTM時間序列預測

一、LSTM基礎原理

LSTM(Long Short-Term Memory)是一種遞歸神經網絡,廣泛用於自然語言處理、時間序列預測等領域。LSTM的主要特點是能夠捕捉長期依賴關係,即能夠在序列中保留多個時刻的信息。

LSTM包含一個單元(cell),可用於存儲狀態和控制流程。單元的核心是三個門(gate):輸入門(input gate)、遺忘門(forget gate)和輸出門(output gate)。輸入門控制激活狀態信息的輸入,遺忘門控制遺忘狀態信息的輸入,輸出門控制輸出信息的輸入。

具體而言,輸入門、遺忘門和輸出門的計算方式如下:

<img src="input.png">
<img src="forget.png">
<img src="output.png">

其中,W、U和b為可學習參數,σ為sigmoid函數。

二、Keras實現LSTM時間序列預測

Keras是一個用於構建神經網絡的高級API,可用於快速構建、訓練和評估各種類型的神經網絡模型。下面將介紹如何使用Keras實現LSTM時間序列預測模型。

1. 數據準備

首先,我們需要準備數據。假設我們要預測某公司2021年1月至6月的銷售額,我們可以使用該公司過去一年的銷售額數據作為訓練集。

我們將訓練集按照時間順序排序,然後取最後n個數據作為測試集(n為自定義的測試集大小)。接下來,我們需要對數據進行標準化處理(將所有數據縮放到[0,1]的範圍內)。

# 加載數據
data = pd.read_csv('sales_data.csv', header=None)

# 排序
data = data.values[1:].astype('float32')
data = data[~np.isnan(data).any(axis=1)]
data = data[np.argsort(data[:, 0])]

# 劃分訓練集和測試集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data[0:train_size, :], data[train_size:len(data), :]

# 標準化處理
scaler = MinMaxScaler(feature_range=(0, 1))
train = scaler.fit_transform(train)
test = scaler.transform(test)

2. 創建數據集

接下來,我們需要創建數據集。LSTM模型需要輸入一個有序的、三維的數據集。具體而言,對於每個樣本,我們需要提供n_steps_in個時間步長(用於預測的歷史數據)以及n_features個特徵(在我們的例子中,這個特徵就是銷售額本身)。同時,我們也需要提供n_steps_out個時間步長的目標值(即預測的值)。

# 創建數據集
def create_dataset(dataset, n_steps_in, n_steps_out):
    dataX, dataY = [], []
    for i in range(len(dataset)-n_steps_in-n_steps_out+1):
        x = dataset[i:(i+n_steps_in), :]
        y = dataset[(i+n_steps_in):(i+n_steps_in+n_steps_out), 0]
        dataX.append(x)
        dataY.append(y)
    return np.array(dataX), np.array(dataY)

n_steps_in = 12
n_steps_out = 6

trainX, trainY = create_dataset(train, n_steps_in, n_steps_out)
testX, testY = create_dataset(test, n_steps_in, n_steps_out)

3. 構建模型

接下來,我們需要構建LSTM模型。在這個例子中,我們使用了一個含有兩個LSTM層的網絡,每個LSTM層含有50個神經元。如果你需要更好的性能,可以使用更深、更寬的網絡。

# 構建模型
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(50, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')

4. 訓練模型

接下來,我們需要訓練模型。LSTM在序列數據中表現良好,但是它也需要更長的時間來訓練。我們在訓練過程中使用了EarlyStopping和ModelCheckpoint回調函數,以便在損失不再下降時停止訓練並保存最好的模型。

# 訓練模型
es = EarlyStopping(monitor='val_loss', patience=10)
mc = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)
history = model.fit(trainX, trainY, epochs=100, batch_size=64, validation_data=(testX, testY), callbacks=[es, mc])

5. 測試模型

最後,我們需要使用測試集驗證模型的性能。我們可以使用模型的predict()方法來進行預測,並將預測結果與實際值進行比較。

# 測試模型
model = load_model('best_model.h5')
predictions = model.predict(testX)
predictions = scaler.inverse_transform(predictions)

# 計算R²分數
r2score = r2_score(testY, predictions)
print('R²分數:{}'.format(r2score))

三、小結

本文介紹了LSTM時間序列預測的基礎原理和Keras實現。在實現過程中,我們對數據進行了準備和標準化處理,創建了LSTM模型,並使用訓練集進行訓練,最後使用測試集進行預測。LSTM相比於其他算法具有更好的性能和更強的泛化能力,可廣泛應用於自然語言處理、時間序列預測等領域。

原創文章,作者:AAHDD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/369397.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AAHDD的頭像AAHDD
上一篇 2025-04-12 13:01
下一篇 2025-04-12 13:01

相關推薦

  • 解決docker-compose 容器時間和服務器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與服務器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • Python序列的常用操作

    Python序列是程序中的重要工具,在數據分析、機器學習、圖像處理等很多領域都有廣泛的應用。Python序列分為三種:列表(list)、元組(tuple)和字符串(string)。…

    編程 2025-04-28
  • 想把你和時間藏起來

    如果你覺得時間過得太快,每天都過得太匆忙,那麼你是否曾經想過想把時間藏起來,慢慢享受每一個瞬間?在這篇文章中,我們將會從多個方面,詳細地闡述如何想把你和時間藏起來。 一、一些時間管…

    編程 2025-04-28
  • 計算斐波那契數列的時間複雜度解析

    斐波那契數列是一個數列,其中每個數都是前兩個數的和,第一個數和第二個數都是1。斐波那契數列的前幾項為:1,1,2,3,5,8,13,21,34,…。計算斐波那契數列常用…

    編程 2025-04-28
  • 時間戳秒級可以用int嗎

    時間戳是指從某個固定的時間點開始計算的已經過去的時間。在計算機領域,時間戳通常使用秒級或毫秒級來表示。在實際使用中,我們經常會遇到需要將時間戳轉換為整數類型的情況。那麼,時間戳秒級…

    編程 2025-04-28
  • 如何在ACM競賽中優化開發時間

    ACM競賽旨在提高程序員的算法能力和解決問題的實力,然而在比賽中優化開發時間同樣至關重要。 一、規劃賽前準備 1、提前熟悉比賽規則和題目類型,了解常見算法、數據結構和快速編寫代碼的…

    編程 2025-04-28
  • 使用JavaScript日期函數掌握時間

    在本文中,我們將深入探討JavaScript日期函數,並且從多個視角介紹其應用方法和重要性。 一、日期的基本表示與獲取 在JavaScript中,使用Date對象來表示日期和時間,…

    編程 2025-04-28
  • Python整數序列求和

    本文主要介紹如何使用Python求解整數序列的和,給出了多種方法和示例代碼。 一、基本概念 在Python中,整數序列指的是一組整數的集合,可以使用列表(list)或元組(tupl…

    編程 2025-04-27
  • Python序列最大值的實現方法

    本篇文章主要介紹如何使用Python尋找序列中的最大值,在文章中我們將通過多個方面,詳細闡述如何實現。 一、Python內置函數max() 使用Python內置函數max()可以快…

    編程 2025-04-27
  • Java Date時間大小比較

    本文將從多個角度詳細闡述Java中Date時間大小的比較,包含了時間字符串轉換、日期相減、使用Calendar比較、使用compareTo方法比較等多個方面。相信這篇文章能夠對你解…

    編程 2025-04-27

發表回復

登錄後才能評論