PyTorch怎么搭建ANN实现时间序列风速预测
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍了PyTorch怎么搭建ANN实现时间序列风速预测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch怎么搭建ANN实现时间序列风速预测文章都会有
千家信息网最后更新 2024年11月23日PyTorch怎么搭建ANN实现时间序列风速预测
这篇文章主要介绍了PyTorch怎么搭建ANN实现时间序列风速预测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch怎么搭建ANN实现时间序列风速预测文章都会有所收获,下面我们一起来看看吧。
数据集
数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将简单搭建来对风速进行预测。
特征构造
对于风速的预测,除了考虑历史风速数据外,还应该充分考虑其余气象因素的影响。因此,我们根据前24个时刻的风速+下一时刻的其余气象数据来预测下一时刻的风速。
数据处理
1.数据预处理
数据预处理阶段,主要将某些列上的文本数据转为数值型数据,同时对原始数据进行归一化处理。文本数据如下所示:
经过转换后,上述各个类别分别被赋予不同的数值,比如"sky is clear"为0,"few clouds"为1。
def load_data(): global Max, Min df = pd.read_csv('Barcelona/Barcelona.csv') df.drop_duplicates(subset=[df.columns[0]], inplace=True) # weather_main listType = df['weather_main'].unique() df.fillna(method='ffill', inplace=True) dic = dict.fromkeys(listType) for i in range(len(listType)): dic[listType[i]] = i df['weather_main'] = df['weather_main'].map(dic) # weather_description listType = df['weather_description'].unique() dic = dict.fromkeys(listType) for i in range(len(listType)): dic[listType[i]] = i df['weather_description'] = df['weather_description'].map(dic) # weather_icon listType = df['weather_icon'].unique() dic = dict.fromkeys(listType) for i in range(len(listType)): dic[listType[i]] = i df['weather_icon'] = df['weather_icon'].map(dic) # print(df) columns = df.columns Max = np.max(df['wind_speed']) # 归一化 Min = np.min(df['wind_speed']) for i in range(2, 17): column = columns[i] if column == 'wind_speed': continue df[column] = df[column].astype('float64') if len(df[df[column] == 0]) == len(df): # 全0 continue mx = np.max(df[column]) mn = np.min(df[column]) df[column] = (df[column] - mn) / (mx - mn) # print(df.isna().sum()) return df
2.数据集构造
利用当前时刻的气象数据和前24个小时的风速数据来预测当前时刻的风速:
def nn_seq(): """ :param flag: :param data: 待处理的数据 :return: X和Y两个数据集,X=[当前时刻的year,month, hour, day, lowtemp, hightemp, 前一天当前时刻的负荷以及前23小时负荷] Y=[当前时刻负荷] """ print('处理数据:') data = load_data() speed = data['wind_speed'] speed = speed.tolist() speed = torch.FloatTensor(speed).view(-1) data = data.values.tolist() seq = [] for i in range(len(data) - 30): train_seq = [] train_label = [] for j in range(i, i + 24): train_seq.append(speed[j]) # 添加温度、湿度、气压等信息 for c in range(2, 7): train_seq.append(data[i + 24][c]) for c in range(8, 17): train_seq.append(data[i + 24][c]) train_label.append(speed[i + 24]) train_seq = torch.FloatTensor(train_seq).view(-1) train_label = torch.FloatTensor(train_label).view(-1) seq.append((train_seq, train_label)) # print(seq[:5]) Dtr = seq[0:int(len(seq) * 0.5)] Den = seq[int(len(seq) * 0.50):int(len(seq) * 0.75)] Dte = seq[int(len(seq) * 0.75):len(seq)] return Dtr, Den, Dte
任意输出其中一条数据:
(tensor([1.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 5.0000e+00, 0.0000e+00, 2.0000e+00, 0.0000e+00, 0.0000e+00, 5.0000e+00, 0.0000e+00, 2.0000e+00, 2.0000e+00, 5.0000e+00, 6.0000e+00, 5.0000e+00, 5.0000e+00, 5.0000e+00, 5.3102e-01, 5.5466e-01, 4.6885e-01, 1.0066e-03, 5.8000e-01, 6.6667e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 9.9338e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00]), tensor([5.]))
数据被划分为三部分:Dtr、Den以及Dte,Dtr用作训练集,Dte用作测试集。
ANN模型
1.模型训练
ANN模型搭建如下:
def ANN(): Dtr, Den, Dte = nn_seq() my_nn = torch.nn.Sequential( torch.nn.Linear(38, 64), torch.nn.ReLU(), torch.nn.Linear(64, 128), torch.nn.ReLU(), torch.nn.Linear(128, 1), ) model = my_nn.to(device) loss_function = nn.MSELoss().to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.001) train_inout_seq = Dtr # 训练 epochs = 50 for i in range(epochs): print('当前', i) for seq, labels in train_inout_seq: seq = seq.to(device) labels = labels.to(device) y_pred = model(seq) single_loss = loss_function(y_pred, labels) optimizer.zero_grad() single_loss.backward() optimizer.step() # if i % 2 == 1: print(f'epoch: {i:3} loss: {single_loss.item():10.8f}') print(f'epoch: {i:3} loss: {single_loss.item():10.10f}') state = {'model': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epochs} torch.save(state, 'Barcelona' + ANN_PATH)
可以看到,模型定义的代码段为:
my_nn = torch.nn.Sequential( torch.nn.Linear(38, 64), torch.nn.ReLU(), torch.nn.Linear(64, 128), torch.nn.ReLU(), torch.nn.Linear(128, 1),)
第一层全连接层输入维度为38(前24小时风速+14种气象数据),输出维度为64;第二层输入为64,输出128;第三层输入为128,输出为1。
2.模型预测及表现
def ANN_predict(ann, test_seq): pred = [] for seq, labels in test_seq: seq = seq.to(device) with torch.no_grad(): pred.append(ann(seq).item()) pred = np.array([pred]) return pred
测试:
def test(): Dtr, Den, Dte = nn_seq() ann = torch.nn.Sequential( torch.nn.Linear(38, 64), torch.nn.ReLU(), torch.nn.Linear(64, 128), torch.nn.ReLU(), torch.nn.Linear(128, 1), ) ann = ann.to(device) ann.load_state_dict(torch.load('Barcelona' + ANN_PATH)['model']) ann.eval() pred = ANN_predict(ann, Dte) print(mean_absolute_error(te_y, pred2.T), np.sqrt(mean_squared_error(te_y, pred2.T)))
ANN在Dte上的表现如下表所示:
MAE | RMSE |
---|---|
1.04 | 1.46 |
关于"PyTorch怎么搭建ANN实现时间序列风速预测"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"PyTorch怎么搭建ANN实现时间序列风速预测"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
数据
风速
时刻
时间
模型
气象
序列
时间序列
处理
输出
小时
知识
负荷
训练
输入
内容
数值
文本
温度
湿度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
灵武市政务软件开发贵吗
六安金狮网络技术
ps4重建数据库视频
网络电视连不起服务器
七日杀服务器设置管理员
福建计算机网络技术最好的二本
网络安全网络优化
软件开发自学第一步
简述数据库技术的发展
泰州品质联想服务器供货厂
网络安全培训顾问
小白怎么给网站加一个数据库
win服务器 重启
易安卓数据库查询
无法解析服务器域名或地址
联想服务器管理口默认
佛山手机软件开发外包
克亚尔国际足球数据库
oa软件开发商家
万豪数据库最新信息
北京国家网络安全宣传片2020
数据库数据类型后面数字是什么
软件开发公司产学研合作协议
有没有做软件开发的网站
万方数据库上传要多久
steam服务器怎么挂假人
服务器白嫖11月
软件开发技术经理负责
昌平区网络安全培训
微信服务器维护登录得了吗