鍵.png)
如何高效爬取全球新聞網(wǎng)站 – 整合Scrapy、Selenium與Mediastack API實(shí)現(xiàn)自動(dòng)化新聞采集
其中:
輸入門用于決定當(dāng)前時(shí)刻哪些信息需要寫入細(xì)胞狀態(tài)。包括兩個(gè)步驟:
計(jì)算輸入門的激活值:
生成新的候選細(xì)胞狀態(tài):
其中:
細(xì)胞狀態(tài)的更新包括兩部分:保留部分舊的細(xì)胞狀態(tài)和添加新的細(xì)胞狀態(tài)。公式如下:
其中:
輸出門用于決定當(dāng)前時(shí)刻的隱藏狀態(tài)。公式如下:
當(dāng)前時(shí)刻的隱藏狀態(tài):
其中:
總的來說,LSTM通過引入遺忘門、輸入門和輸出門,有效地控制了信息的流動(dòng),解決了傳統(tǒng)RNN在處理長(zhǎng)序列數(shù)據(jù)時(shí)的梯度消失和梯度爆炸問題。
這里再匯總一下上面的公式:
通過這些公式,LSTM能夠有效地捕捉和保留序列中的長(zhǎng)期依賴關(guān)系,從而在處理時(shí)間序列數(shù)據(jù)、自然語言處理等任務(wù)中表現(xiàn)出色。
數(shù)據(jù)集介紹
數(shù)據(jù)集來自UCI機(jī)器學(xué)習(xí)庫的北京PM2.5數(shù)據(jù)集。數(shù)據(jù)包含2010年至2014年北京空氣質(zhì)量監(jiān)測(cè)數(shù)據(jù),包括PM2.5濃度、天氣數(shù)據(jù)等。
公眾號(hào)后臺(tái),回復(fù)「數(shù)據(jù)集」,取PRSA_data_2010.1.1-2014.12.31.csv
PRSA_data_2010.1.1-2014.12.31.csv
數(shù)據(jù)集包括以下列:
No
: 行號(hào)year
: 年month
: 月day
: 日hour
: 小時(shí)pm2.5
: PM2.5濃度(ug/m^3)DEWP
: 露點(diǎn)溫度(攝氏度)TEMP
: 溫度(攝氏度)PRES
: 壓力(hPa)cbwd
: 風(fēng)向Iws
: 風(fēng)速(m/s)Is
: 累計(jì)小時(shí)數(shù)Ir
: 累計(jì)降雨量(mm)算法流程
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.callbacks import EarlyStopping
# 數(shù)據(jù)加載
data = pd.read_csv('PRSA_data_2010.1.1-2014.12.31.csv')
# 數(shù)據(jù)預(yù)處理
data['pm2.5'].fillna(data['pm2.5'].mean(), inplace=True) # 處理缺失值
# 選擇特征和目標(biāo)變量
features = ['DEWP', 'TEMP', 'PRES', 'Iws']
target = 'pm2.5'
# 標(biāo)準(zhǔn)化
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data[features + [target]])
# 創(chuàng)建時(shí)間序列數(shù)據(jù)集
def create_dataset(dataset, look_back=1):
X, y = [], []
for i in range(len(dataset) - look_back):
X.append(dataset[i:(i + look_back), :-1])
y.append(dataset[i + look_back, -1])
return np.array(X), np.array(y)
look_back = 24
X, y = create_dataset(data_scaled, look_back)
# 劃分訓(xùn)練集和測(cè)試集
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:]
# 構(gòu)建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(look_back, len(features))))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
# 模型訓(xùn)練
early_stopping = EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.2, callbacks=[early_stopping])
# 模型評(píng)估
y_pred = model.predict(X_test)
# 反標(biāo)準(zhǔn)化
y_test_inv = scaler.inverse_transform(np.concatenate((X_test[:, -1, :-1], y_test.reshape(-1, 1)), axis=1))[:, -1]
y_pred_inv = scaler.inverse_transform(np.concatenate((X_test[:, -1, :-1], y_pred), axis=1))[:, -1]
# 繪制結(jié)果
plt.figure(figsize=(12, 6))
plt.plot(y_test_inv, label='True')
plt.plot(y_pred_inv, label='Predicted')
plt.legend()
plt.show()
# 繪制損失曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.show()
代碼中的步驟一些細(xì)節(jié),再給大家說一下:
以上,整個(gè)是一個(gè)完整的LSTM時(shí)間序列預(yù)測(cè)的案例,包括數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓(xùn)練、評(píng)估和可視化。大家在自己實(shí)際的實(shí)驗(yàn)中,根據(jù)需求進(jìn)行進(jìn)一步的調(diào)整和優(yōu)化。
本文章轉(zhuǎn)載微信公眾號(hào)@深夜努力寫Python
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)