PyTorch怎么搭建ANN实现时间序列风速预测
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了PyTorch怎么搭建ANN实现时间序列风速预测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch怎么搭建ANN实现时间序列风速预测文章都会有
千家信息网最后更新 2025年11月07日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 df2.数据集构造
利用当前时刻的气象数据和前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安全错误
数据库的锁怎样保障安全
流放之路.数据库
服务器安全证书有效吗
满足个数据库
通用软件开发计费标准
佛山酒店软件开发咨询
网络安全风险评估算法
数据库发展与新技术
本地灾备网络技术
网络安全行业就业前景如何
网络安全绘
来电登录电脑连接服务器超时
网络技术员指导教师评语
sa数据库连接密码
piapp服务器
软件开发全套工作计划
软件开发岗位需要什么要求
5g时代网络安全试点
怎么查看服务器cpu
怎么把信息关联到服务器上
ed2k电驴服务器列表
地下城服务器爆满后看不到几人
网络安全主题队会主持词
广州erp软件开发服务
海南省软件开发
软件开发设计是商标第几类
安卓软件开发使用什么软件
智慧牙 国内国外数据库
以下哪项是非关系型数据库
网络技术公务员工资
国家信息网络安全研究中心