简介:基于长江干线重点地区历史水位数据,回归预测分析指定地区水位信息,构建虚拟水文站。在水位监测设备故障情况下,及时预测水位信息。通过预测水位信息与实际水位信息对比,可间接反应水位监测设备健康状态,及时发现故障设备。
1.数据准备
本案例以宜宾、重庆、宜昌、汉口、南京、镇江等19个长江干线水文站采集水位信息作为输入参数,预测泸州水位信息。主要步骤包括数据采集、数据清洗和数据加载工作,共收集541天历史水位数据。
all_features = pd.read_csv('dataset/cjwaterlevelnormal.csv') #读取所有数据
new_features = pre_treatment(all_features, feature_names)
print(new_features)
YIBIN LUZHOU BEIPEI CHONGQING ... ANQING WUHU NANJING ZHENJIANG
0 2.6 3.3 0.12 14.02 ... 5.01 3.64 2.86 3.38
1 2.6 3.3 0.12 14.02 ... 5.01 3.64 2.86 3.38
2 2.6 3.3 0.12 14.02 ... 5.01 3.64 2.86 3.38
3 2.6 3.3 0.12 14.02 ... 5.01 3.64 2.86 3.38
4 2.6 3.3 0.12 14.02 ... 5.01 3.64 2.86 3.38
.. ... ... ... ... ... ... ... ... ...
537 6.0 4.9 3.78 6.97 ... 10.37 7.08 5.68 5.37
538 5.6 4.8 4.00 7.18 ... 10.33 7.05 5.94 5.41
539 5.4 4.7 3.50 7.39 ... 10.31 7.05 6.03 5.18
540 6.2 4.9 4.55 8.81 ... 10.35 7.10 6.06 5.03
541 6.0 5.4 7.87 11.34 ... 10.41 7.19 6.02 4.86
2.模型设计与训练
选取434组历史数据作为训练集。
net = LinearNet(args.input_dim, args.output_dim)
init.normal_(net.linear.weight, mean=0, std=1)
init.constant_(net.linear.bias, val=0)
loss = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=args.learning_rate)
# 训练模型
loss_data = list()
for epoch in range(1, args.num_epochs + 1):
for x, y in data_iter:
output = net(x)
l = loss(output, y.view(-1, 1))
optimizer.zero_grad() #梯度清零,等价于net.zero_grad
l.backward()
optimizer.step()
loss_data.append(l.item())
if epoch % 100 == 0:
plt.title("loss data")
plt.plot(range(len(loss_data)), loss_data, 'r', label='loss', lineWidth=0.5)
plt.show()
损失函数输出结果:
选取剩余108行历史数据作为测试集。
y_pre = list()
net = LinearNet(args.input_dim, args.output_dim)
net.load_state_dict(torch.load(file))
for x in X_test:
prediction = net(x)
y_pre.append(prediction.detach().numpy())
# 绘制曲线图
plt.title("result data")
fig, ax = plt.subplots()
ax.plot(range(len(y_pre)), y_pre, label='prediction', lineWidth=0.5)
ax.plot(range(len(y_pre)), y_test.detach().numpy(), label='practical', lineWidth=0.5)
ax.legend()
plt.show()
泸州水位预测值与实际值比较结果: