iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

今天是第十五天,最近地震很多因此我們可以寫一個哪時候可能會有很大震感的Lstm程式預測,以下是程式碼

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 1. 讀取並處理數據
# 假設有一個地震數據集 earthquake_data.csv
data = pd.read_csv('earthquake_data.csv')

# 假設數據集包含 'time', 'magnitude', 'depth', 'intensity' 四個欄位
# time: 發生時間, magnitude: 震級, depth: 震源深度, intensity: 震感指數

# 2. 特徵選擇
features = data[['magnitude', 'depth']].values
target = data['intensity'].values

# 3. 數據歸一化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)

# 4. 構建訓練集和測試集
look_back = 10  # 使用前10個時間點的數據進行預測
X, y = [], []
for i in range(look_back, len(scaled_features)):
    X.append(scaled_features[i-look_back:i])
    y.append(target[i])
X, y = np.array(X), np.array(y)

# 5. 拆分訓練集和測試集
split = int(0.8 * len(X))
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]

# 6. 建立LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(LSTM(units=50))
model.add(Dense(1))

# 7. 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 8. 訓練模型
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))

# 9. 預測
predicted_intensity = model.predict(X_test)

# 10. 結果可視化
plt.plot(y_test, color='blue', label='Actual Intensity')
plt.plot(predicted_intensity, color='red', label='Predicted Intensity')
plt.title('Earthquake Intensity Prediction')
plt.xlabel('Time')
plt.ylabel('Intensity')
plt.legend()
plt.show()

1. 匯入必要的庫

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

這裡匯入了 Python 的數個庫:

  • numpypandas 用來處理和操作數據。
  • matplotlib.pyplot 用來繪製圖表。
  • MinMaxScaler 是一個數據歸一化工具,將數據縮放到一個固定範圍內,通常是 0 到 1。
  • Sequential 是一個順序模型,這是一種簡單的神經網絡模型,可以通過堆疊多層來構建。
  • LSTM 是長短期記憶網絡的層,用於捕捉數據中的時間序列依賴關係。
  • Dense 是一個全連接層,用來產生最終的預測結果。

2. 讀取並處理數據

data = pd.read_csv('earthquake_data.csv')

這一行從名為 earthquake_data.csv 的文件中讀取數據,並將其載入到 data 這個 DataFrame 中。

features = data[['magnitude', 'depth']].values
target = data['intensity'].values

這裡選擇了震級(magnitude)和震源深度(depth)作為特徵(features),並將震感指數(intensity)作為目標值(target),用於模型的訓練。

3. 數據歸一化

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)

這裡使用 MinMaxScaler 將特徵數據縮放到 0 到 1 的範圍內。這樣做的目的是為了加快模型的收斂速度,並且避免不同特徵值範圍差異過大。

4. 構建訓練集和測試集

look_back = 10  # 使用前10個時間點的數據進行預測
X, y = [], []
for i in range(look_back, len(scaled_features)):
    X.append(scaled_features[i-look_back:i])
    y.append(target[i])
X, y = np.array(X), np.array(y)

這部分代碼定義了 look_back 參數,表示模型在每次預測時會考慮前 10 個時間步的數據。然後,通過一個迴圈將數據組織成適合 LSTM 模型的格式:

  • X 是輸入數據,包含了前 10 個時間步的特徵。
  • y 是輸出數據,對應於每個時間步的震感指數。

5. 拆分訓練集和測試集

split = int(0.8 * len(X))
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]

這部分將數據集分為訓練集和測試集。split 定義了分割點,取數據的前 80% 為訓練集,後 20% 為測試集。這樣做是為了用訓練集訓練模型,然後用測試集檢驗模型的預測效果。

6. 建立LSTM模型

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(LSTM(units=50))
model.add(Dense(1))

這部分代碼構建了 LSTM 模型:

  • 第一層 LSTM 有 50 個單元,並設置 return_sequences=True,表示返回每個時間步的輸出。
  • 第二層 LSTM 同樣有 50 個單元,但不返回整個序列,只返回最後的時間步的輸出。
  • 最後,通過 Dense 層進行全連接,輸出一個值作為預測的震感指數。

7. 編譯模型

model.compile(optimizer='adam', loss='mean_squared_error')

這部分代碼編譯模型,指定使用 adam 優化器和均方誤差(mean_squared_error)作為損失函數。adam 是一種常用的優化器,能自動調整學習率以加快模型的訓練速度。

8. 訓練模型

model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))

這裡用訓練集訓練模型,epochs=50 表示訓練 50 次迭代,batch_size=32 表示每次更新權重時使用 32 個樣本。validation_data 是測試集,用於在每個迭代後檢查模型的表現。

9. 預測

predicted_intensity = model.predict(X_test)

這部分代碼使用測試集的數據進行預測,模型會返回對應的震感指數預測值。

10. 結果可視化

plt.plot(y_test, color='blue', label='Actual Intensity')
plt.plot(predicted_intensity, color='red', label='Predicted Intensity')
plt.title('Earthquake Intensity Prediction')
plt.xlabel('Time')
plt.ylabel('Intensity')
plt.legend()
plt.show()

這部分代碼將實際的震感指數與模型預測的震感指數繪製成圖表,以便可視化地比較模型的預測效果。

總結

這個 LSTM 模型的目的是根據地震的震級和震源深度等特徵來預測地震的震感指數。透過這個模型,我們可以了解某些地震特徵如何影響震感,並嘗試提前預測地震帶來的震感強度。


上一篇
day 14 Yolo辨識輪匡是否變形
下一篇
day 16 Lstm情緒分析安排景點系統
系列文
LSTM結合Yolo v8對於多隻斑馬魚行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言