交通流量预测模型源代码


本文提供可直接运行的**基于LSTM的短时交通流量预测PyTorch实现源代码**,适配时间序列格式的交通流量数据,为智能交通系统的流量预警、调度优化提供基础模型支撑,后续可扩展支持时空特征、多源外部特征提升预测精度。

### 前置依赖
运行前需安装以下依赖库:
“`bash
pip install torch pandas numpy scikit-learn matplotlib
“`

### 完整源代码
“`python
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset, DataLoader
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error

def create_dataset(data, seq_len=24, pred_len=1):
“””
构造时序预测数据集:用前seq_len个时间步数据预测后pred_len个时间步流量
:param data: 原始流量时序数组
:param seq_len: 输入序列长度
:param pred_len: 预测序列长度
“””
X, y = [], []
for i in range(len(data) – seq_len – pred_len + 1):
X.append(data[i:i+seq_len])
y.append(data[i+seq_len:i+seq_len+pred_len])
return np.array(X), np.array(y)

class TrafficLSTM(nn.Module):
“””LSTM交通流量预测模型定义”””
def __init__(self, input_size=1, hidden_size=64, num_layers=2, output_size=1):
super().__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
# LSTM层,dropout防止过拟合
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, dropout=0.2)
# 全连接输出层,输出预测流量值
self.fc = nn.Linear(hidden_size, output_size)

def forward(self, x):
# 初始化隐藏层和细胞状态
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
# LSTM前向传播
out, _ = self.lstm(x, (h0, c0))
# 取最后一个时间步的输出做预测
out = self.fc(out[:, -1, :])
return out

if __name__ == “__main__”:
# ====================== 超参数配置 ======================
seq_len = 24 # 输入时间步:用前24个15分钟粒度的观测值(对应6小时历史数据)
pred_len = 1 # 预测时间步:预测未来1个15分钟的流量
batch_size = 32
epochs = 50
lr = 0.001
device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
print(f”运行设备: {device}”)

# ====================== 1. 数据加载与预处理 ======================
# 示例:模拟具有日周期性的交通流量数据,真实场景替换为读取本地数据:
# raw_data = pd.read_csv(“traffic_flow.csv”)[“flow”].values # 需提前处理缺失值、异常值
np.random.seed(42)
time_steps = 2000 # 总数据量
t = np.arange(time_steps)
# 模拟规则:基础流量+日周期(96个15分钟步为1天)+随机噪声
raw_data = 120 + 40*np.sin(2*np.pi*t/96) + 12*np.random.randn(time_steps)

# 数据归一化到0-1区间,提升模型收敛效率
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(raw_data.reshape(-1, 1)).flatten()

# 构造数据集、划分训练集测试集(8:2)
X, y = create_dataset(scaled_data, seq_len, pred_len)
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:]

# 转换为PyTorch张量,适配LSTM输入格式 [batch, seq_len, input_size]
X_train = torch.from_numpy(X_train).float().unsqueeze(-1).to(device)
y_train = torch.from_numpy(y_train).float().to(device)
X_test = torch.from_numpy(X_test).float().unsqueeze(-1).to(device)
y_test = torch.from_numpy(y_test).float().to(device)

# 构造数据加载器
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# ====================== 2. 模型初始化 ======================
model = TrafficLSTM(
input_size=1, # 单特征输入仅为流量,若加入车速、天气等特征可调整为对应特征维度
hidden_size=64,
num_layers=2,
output_size=pred_len
).to(device)
criterion = nn.MSELoss() # 回归任务用均方误差损失
optimizer = torch.optim.Adam(model.parameters(), lr=lr)

# ====================== 3. 模型训练 ======================
model.train()
for epoch in range(epochs):
total_loss = 0
for batch_X, batch_y in train_loader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
total_loss += loss.item()
avg_loss = total_loss / len(train_loader)
if (epoch+1) % 5 == 0:
print(f”Epoch [{epoch+1}/{epochs}], 训练集平均损失: {avg_loss:.4f}”)

# ====================== 4. 模型测试与效果评估 ======================
model.eval()
with torch.no_grad():
pred = model(X_test).cpu().numpy()
y_test = y_test.cpu().numpy()
# 反归一化得到真实流量值
pred = scaler.inverse_transform(pred)
y_test = scaler.inverse_transform(y_test)

# 计算评估指标
mae = mean_absolute_error(y_test, pred)
rmse = np.sqrt(mean_squared_error(y_test, pred))
print(“=”*50)
print(f”测试集MAE: {mae:.2f} 辆/15分钟”)
print(f”测试集RMSE: {rmse:.2f} 辆/15分钟”)
“`

### 代码说明与扩展方向
1. **数据替换**:真实场景可使用PeMS公开交通数据集、本地卡口/雷达采集的流量数据,提前做缺失值插值、异常值过滤即可接入;
2. **精度优化**:若需考虑路网空间关联,可替换LSTM为STGCN、T-GCN等时空图卷积模型;若需长时预测(>1小时),可引入Informer、Time-Series Transformer等长时序预测架构;
3. **特征扩展**:可加入节假日、天气、道路限速、交通事故等外部特征,调整input_size参数即可适配多特征输入。

本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注