今天是第十五天,最近地震很多因此我們可以寫一個哪時候可能會有很大震感的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()
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 的數個庫:
numpy
和 pandas
用來處理和操作數據。matplotlib.pyplot
用來繪製圖表。MinMaxScaler
是一個數據歸一化工具,將數據縮放到一個固定範圍內,通常是 0 到 1。Sequential
是一個順序模型,這是一種簡單的神經網絡模型,可以通過堆疊多層來構建。LSTM
是長短期記憶網絡的層,用於捕捉數據中的時間序列依賴關係。Dense
是一個全連接層,用來產生最終的預測結果。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
),用於模型的訓練。
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)
這裡使用 MinMaxScaler
將特徵數據縮放到 0 到 1 的範圍內。這樣做的目的是為了加快模型的收斂速度,並且避免不同特徵值範圍差異過大。
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
是輸出數據,對應於每個時間步的震感指數。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% 為測試集。這樣做是為了用訓練集訓練模型,然後用測試集檢驗模型的預測效果。
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 模型:
return_sequences=True
,表示返回每個時間步的輸出。Dense
層進行全連接,輸出一個值作為預測的震感指數。model.compile(optimizer='adam', loss='mean_squared_error')
這部分代碼編譯模型,指定使用 adam
優化器和均方誤差(mean_squared_error
)作為損失函數。adam
是一種常用的優化器,能自動調整學習率以加快模型的訓練速度。
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
是測試集,用於在每個迭代後檢查模型的表現。
predicted_intensity = model.predict(X_test)
這部分代碼使用測試集的數據進行預測,模型會返回對應的震感指數預測值。
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 模型的目的是根據地震的震級和震源深度等特徵來預測地震的震感指數。透過這個模型,我們可以了解某些地震特徵如何影響震感,並嘗試提前預測地震帶來的震感強度。