終于把 LSTM 算法搞懂了!!!
今天給大家分享一個強大的算法模型,LSTM
LSTM(長短期記憶網絡)是一種特殊類型的循環神經網絡(RNN),它能夠有效地解決傳統 RNN 在處理長序列時遇到的梯度消失和梯度爆炸問題。
LSTM 的核心思想是通過多個門控機制來控制信息的流動,這些門控機制可以選擇性地保留或丟棄輸入數據,從而幫助網絡捕捉長時間跨度的依賴關系。
LSTM的工作原理
LSTM 的核心思想是通過引入記憶單元來存儲信息,并使用三個主要的門(輸入門、遺忘門、輸出門)來決定哪些信息應該保留,哪些信息應該遺忘,以及哪些信息應該更新。
遺忘門(Forget Gate)
遺忘門決定了哪些信息將從記憶單元中丟棄,它的輸出是一個0到1之間的值,0表示完全丟棄信息,1表示完全保留信息。
更新記憶單元狀態
記憶單元通過遺忘門和輸入門的輸出進行更新。
輸出門(Output Gate)
LSTM的優勢
- 避免梯度消失/爆炸
LSTM能夠通過門控機制,有效地保存和更新記憶信息,避免了傳統RNN中由于長時間步的反向傳播導致的梯度消失和梯度爆炸問題。 - 適應長期記憶
LSTM 可以根據需求保留長期記憶(通過記憶單元狀態),使得它在處理長序列任務時更加高效。 - 靈活性強
LSTM不僅適用于標準的時間序列任務,還能夠處理文本、語音等多種任務,應用非常廣泛。
案例分享
下面是一個使用 LSTM(長短期記憶網絡)進行蘋果公司股價預測的示例代碼。
我們將使用 yfinance 庫獲取蘋果公司歷史股價數據, 并通過 TensorFlow 庫來構建 LSTM 模型。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
ticker = 'AAPL' # 蘋果的股票代碼
start_date = '2010-01-01'
end_date = '2024-11-01'
data = yf.download(ticker, start=start_date, end=end_date)
data = data[['Close']]
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
def create_dataset(data, time_step=60):
X, y = [], []
for i in range(len(data) - time_step - 1):
X.append(data[i:(i + time_step), 0])
y.append(data[i + time_step, 0])
return np.array(X), np.array(y)
time_step = 60 # 使用過去60天的數據來預測下一天的股價
X, y = create_dataset(scaled_data, time_step)
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
# 構建LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2)) # Dropout層防止過擬合
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=1)) # 輸出預測的股價
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=10, batch_size=32)
predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)
y_test_actual = scaler.inverse_transform(y_test.reshape(-1, 1))
plt.figure(figsize=(14, 6))
plt.plot(data.index[train_size+time_step+1:], y_test_actual, color='blue', label='Real Price')
plt.plot(data.index[train_size+time_step+1:], predictions, color='red', label='Predicted Price')
plt.title('Apple Stock Price Prediction using LSTM')
plt.xlabel('Time')
plt.ylabel('Stock Price (USD)')
plt.legend()
plt.show()