代码拉取完成,页面将自动刷新
同步操作将从 juju/电力系统负荷预测分析 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data_csv=pd.read_csv("D:/03研究生学习/数学建模/示例数据/附件1-区域15分钟负荷数据.csv",usecols=[1])
# 数据预处理
data_csv = data_csv.dropna() # 滤除缺失数据
dataset = data_csv.values # 获得csv的值
dataset = dataset.astype('float32')
mean_value = np.mean(dataset) # 获得平均值
std_value = np.std(dataset) # 获得标准差
dataset = list(map(lambda x: (x - mean_value) / std_value, dataset)) # Z-Score标准化
plt.plot(dataset)
plt.show()
#设置X,Y数据集。以look_back=672(7天)为准,取第一个7天为数组,形成data_X,取第8天(96个)作为预测值,形成data_Y,完成训练集的提取。
input_len=672
label_len=96
def create_dataset(dataset):
dataX, dataY = [], []
for i in range(0,len(dataset)-label_len,label_len):
a = dataset[i:(i + input_len)]
dataX.append(a)
dataY.append(dataset[i + input_len:i + input_len+label_len])
return np.array(dataX), np.array(dataY)
# 创建好输入输出
data_X, data_Y = create_dataset(dataset)
# 划分训练集和测试集,80% 作为训练集
train_size = int(len(data_X) * 0.8)
test_size = len(data_X) - train_size
train_X = data_X[:train_size]
train_Y = data_Y[:train_size]
test_X = data_X[train_size:]
test_Y = data_Y[train_size:]
# 设置LSTM能识别的数据类型,形成tran_X的一维两个参数的数组,train_Y的一维一个参数的数组。并转化为tensor类型
import torch
# 把list转numpy三维数组,第一维自适应
train_X = train_X.reshape(-1, 1, input_len)
train_Y = train_Y.reshape(-1, 1, label_len)
test_X = test_X.reshape(-1, 1, input_len)
# numpy数组转tensor
train_x = torch.from_numpy(train_X)
train_y = torch.from_numpy(train_Y)
test_x = torch.from_numpy(test_X)
# 建立LSTM模型,第一层为LSTM神经网络,第二层为一个全连接层。
from torch import nn
from torch.autograd import Variable
class lstm(nn.Module):
def __init__(self,input_size=input_len,hidden_size=input_len,output_size=label_len,num_layer=2):
super(lstm,self).__init__()
self.layer1 = nn.LSTM(input_size,hidden_size,num_layer)
self.layer2 = nn.Linear(hidden_size,output_size)
def forward(self,x):
x,_ = self.layer1(x)
s,b,h = x.size()
x = x.view(s*b,h)
x = self.layer2(x)
x = x.view(s,b,-1)
return x
model = lstm(input_len, input_len*2,label_len,2)
model = model.cuda()
# 设置交叉熵损失函数和自适应梯度下降算法
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)
# 开始训练
for e in range(1000):
var_x = Variable(train_x).cuda()
var_y = Variable(train_y).cuda()
# 前向传播
out = model(var_x)
loss = criterion(out, var_y)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (e + 1) % 100 == 0: # 每 100 次输出结果
print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.item()))
model = model.eval() # 转换成测试模式
# data_X = data_X.reshape(-1, 1, 2)
# data_X = torch.from_numpy(data_X)
var_test_x = Variable(test_x).cuda()
pred_test_y = model(var_test_x) # 测试集的预测结果
# 改变输出的格式
# pred_test = pred_test.view(-1).data.numpy()
pred_test_Y = pred_test_y.view(-1).data.cpu().numpy().reshape(-1,label_len,1)
# 取最后一段5天预测的结果和实际对比,画出测试集中实际结果和预测的结果
pred_last_test_Y=pred_test_Y[-1]
last_test_Y=test_Y[-1]
plt.plot(pred_last_test_Y, 'r', label='prediction')
plt.plot(last_test_Y, 'b', label='real')
plt.legend(loc='best')
plt.show()
# 分析一下误差
# 均方误差
MSE = np.linalg.norm(last_test_Y-pred_last_test_Y, ord=2)**2/len(last_test_Y)
# 平均绝对误差
MAE = np.linalg.norm(last_test_Y-pred_last_test_Y, ord=1)/len(last_test_Y)
# 平均绝对百分比误差
MAPE = np.mean(np.abs((last_test_Y-pred_last_test_Y) / last_test_Y)) * 100
# 模型的准确率
Accuracy=(1-np.sqrt(np.mean(((last_test_Y-pred_last_test_Y) / last_test_Y)**2)))*100
print("MSE={}\nMAE={}\nMAPE={}%\nAccuracy={}%\n".format(MSE,MAE,MAPE,Accuracy))
# 使用滑动窗口预测未来的10天,也就是10个96段15分钟
pred_list=dataset[0-input_len:].copy()
for i in range(0,10*96,96):
input_x=pred_list[i:i+input_len]
input_x=np.array(input_x)
input_x=input_x.reshape(-1,1,input_len)
var_input_x=Variable(torch.from_numpy(input_x)).cuda()
pred=model(var_input_x)
pred=pred.view(-1).data.cpu().numpy()
pred_list.append(pred)
prediction=np.array(pred_list).reshape(-1)
# 画出历史15天的图形和预测的10天的图形
plt.plot(range(len(dataset)),dataset, 'b', label='history')
plt.plot(range(len(dataset),len(dataset)+len(prediction)),prediction, 'r', label='prediction')
plt.legend(loc='best')
plt.show()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。