今天是第9天我想寫一個Lstm預測候鳥飛行距離的程式,以下是程式碼
pip install numpy pandas tensorflow scikit-learn
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
# 假設我們有一個包含候鳥行為的時序數據集
# 為了簡單起見,這裡創建了一個隨機數據集作為示例
# 通常你會從CSV或其他資料來源讀取這些數據
data_size = 1000
timesteps = 10
# 創建虛擬數據: 每一行代表一天的飛行距離、速度和高度
data = np.random.rand(data_size, 3)
# 將數據轉換為Pandas DataFrame
df = pd.DataFrame(data, columns=['distance', 'speed', 'altitude'])
# 資料正規化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df)
# 生成輸入和輸出的時間序列
X = []
y = []
for i in range(timesteps, len(scaled_data)):
X.append(scaled_data[i-timesteps:i])
y.append(scaled_data[i])
X, y = np.array(X), np.array(y)
# 分割資料為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 建立LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=3)) # 因為我們的輸出有3個特徵: distance, speed, altitude
# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 訓練模型
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))
# 預測未來行為
predictions = model.predict(X_test)
# 反轉正規化以恢復原始數據範圍
predictions = scaler.inverse_transform(predictions)
print("預測結果:")
print(predictions)
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
numpy
和 pandas
是用來處理數據的基本庫。tensorflow
是一個機器學習框架,用來建立和訓練深度學習模型。Sequential
、LSTM
、Dense
、Dropout
都是 Keras(TensorFlow 的高層 API)提供的模組,用於構建和編譯模型。MinMaxScaler
用於數據正規化,使數據值落在一個統一的範圍內(例如 0 到 1)。train_test_split
用於將數據分割為訓練集和測試集。data_size = 1000
timesteps = 10
data = np.random.rand(data_size, 3)
df = pd.DataFrame(data, columns=['distance', 'speed', 'altitude'])
data_size
是數據集的大小(1000 行)。timesteps
表示LSTM模型將考慮的時間步數,也就是在預測下一步時使用多少個過去的數據點。data
是一個隨機生成的 1000 行 x 3 列的數據集,假設這些數據分別代表候鳥的飛行距離、速度和高度。df
是一個Pandas DataFrame,將數據標籤為 distance
(距離)、speed
(速度)和 altitude
(高度)。scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df)
MinMaxScaler
將數據縮放到 [0, 1]
的範圍內。這樣可以使LSTM模型更容易收斂,並防止數據值差異過大導致模型表現不穩定。X = []
y = []
for i in range(timesteps, len(scaled_data)):
X.append(scaled_data[i-timesteps:i])
y.append(scaled_data[i])
X, y = np.array(X), np.array(y)
X
是輸入數據集,y
是輸出數據集。X
包含 timesteps
(10 個時間步)的數據,而 y
則是下一個時間步的數據。timesteps
是 10,那麼 X[0]
包含的是第 1 到第 10 步的數據,而 y[0]
包含的是第 11 步的數據。X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
train_test_split
將數據分為訓練集和測試集,測試集佔 20%。random_state=42
是設置隨機種子,使得每次運行程式碼時分割結果一致。model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=3)) # 輸出有3個特徵: distance, speed, altitude
Sequential()
是一個線性堆疊的模型,它允許你逐層構建神經網絡。LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2]))
是第一個LSTM層,有 50 個單元(或神經元)。return_sequences=True
表示返回完整的序列,這樣下一層 LSTM 層可以接收輸出的整個序列。Dropout(0.2)
是一個正則化層,用來防止過擬合。這意味著每次訓練都會隨機“丟棄”20%的單元。LSTM(units=50)
層也有 50 個單元,但不返回序列。Dense(units=3)
是一個全連接層,輸出 3 個單元,對應於 distance
、speed
和 altitude
。model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))
compile
函數用來配置訓練過程。這裡使用 adam
優化器(是一種常用的梯度下降優化方法),和 mean_squared_error
損失函數(適用於回歸問題)。fit
函數開始訓練模型,訓練 20 個回合(epochs
),每次處理 32 個樣本(batch_size
),並且使用測試集來驗證模型的表現。predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)
print("預測結果:")
print(predictions)
model.predict(X_test)
用測試集來進行預測,predictions
變量儲存了模型的預測結果。scaler.inverse_transform(predictions)
將預測結果反轉正規化,恢復到原始數據的範圍,這樣我們可以解讀預測結果。這個程式碼演示了如何使用LSTM模型來預測時序數據中的未來行為模式。在實際應用中,你需要用實際的候鳥行為數據來替換這裡的隨機數據,並且可能需要進行更多的數據預處理和模型調整,以提高預測的準確性。