BP神经网络如何用历史数据预测未来数据
本文主要为了解决如何用BP神经网络由历史的目标数据与因素数据去预测未来的目标数据。Bp神经网络的具体算法步骤与代码在网络上已经有很多大佬写过了,本文提供了将其应用于预测的方法。(附简单直接可使用代码)
开始我也在思考,简答来说bp神经网络从本质上来说就是个拟合的工具,用n种因素数据与训练好的权值w去以最优的非线性方式去拟合预测的目标数据。常规bp神经网络只能做到对目标数据的拟合而无法预测出未来数据。
但是当我们想要预测未来的目标数据的时候就会出现一个问题:我们没有未来的因素数据!就比如我想预测未来的地区用电量,就需要未来人口等因素数据。而我要是都知道未来的这些数据了我还要预测目标数据干什么?
好了说回正题,那么既然是一种非线性拟合的方法,那我们可以换一种思路来想这个问题。下面有三种方法:
(1)假定我们现在手里的数据有1个预测的目标数据,n种因素数据,都是1~8年的时间序列数据。
偏移对应法:
我们将1~6年的因素数据输入网络中,对应的期望预测目标数据是3~8年,将网络训练好以后再将7~8年的因素数据作为9~10年目标数据的因素数据去乘上训练完成的权重矩阵,最终就可以输出9~10年的目标预测数据。
(2)如果说以上面那样的偏移对应法,为了保证精准度只能最多偏移两三年,否则过多偏移会导致数据失真,所以这里用另外一种思想。
滚动时间训练法:
开始与偏移法相同,但是这次只偏移一年,即1~7年因素数据、对应的期望预测目标数据是2~8年,训练好后用第8年的因素数据乘上训练好的权值矩阵得到第9年的目标预测数据。
然后再以上次得到第9年的目标预测为已知条件,训练新的bp网络,2~8年因素数据、对应的期望预测目标数据是3~9年相同方法预测出第10年的目标预测数据。之后以第10年的预测数据作为已知条件重复滚动。如果是想预测更多那么第一步偏移的年数可以多一点。
(3)如果你的因素数据是时间,那么就无忧了,因为未来的时间数据肯定没问题。
但要是因素都已经是时间了,其实也可以考虑用灰色预测模型。
最后小结一哈:1)预测前可以先进行准确度检验,即划分训练集和验证集。代码的话相信很多大佬已经写过很多次了,我写的一般般就放在文章最后供一点点参考(pyhton),但是清楚思路最重要。
2)可以记得运行的时候要多训练几次,bp神经网络每一次的结果都不一样,和谈恋爱时的心情一样有时好有时坏,我们选精度最高的那个模型。实测以上的几种方法的精确度下来,最好是不要预测太长时间序列,适合中短期的预测模型。
3)如果是数学建模中的话建议最好还是用标准化预测的模型,bp神经网络这种黑盒思想的方法很多老师审核不太认同。当然论文研究里适用很广。
刚写完自己的论文后思考出的一些方法和感悟,受苦于机器学习的小白一枚,若有帮助感谢各位多多点赞!
pyhton代码:
这里的代码是以1999到2021年的数据操作,采用的是第一种偏移对应法,因素数据选1999-2018对应的目标数据是2002到2021年,偏移对应的年份是三年,所以最后输入2019-2021年的因素数据到训练好的网络时得到的是2022-2024年的目标数据预测。
刚自己写了一个可以套用的函数,你可以在选择偏移年份处将k改为自己想要往后预测的年份,再导入你的数据,最后在结尾处有输出预测值(要是中间的算法部分看不懂也可以用)。
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler#导入你的数据
df=pd.read_excel('datanew.xlsx')
x=df[['全年平均日照', '可支配收入','人户','发电量','实际居民用电量']]
y=df[['用水量']]
time = []
print(x,y)#选择偏移对应的年份(这里是偏移了三年也就是往后预测三年)
k = 3#(往后预测的年份)
def pianyi(k):a = len(x)b = len(y)xunlianx = x[0:b-k]#因素数据选1999-2018xunliany = y[k:b]#用于最后预测未来目标数据zongx = x[0:b]#用于最后预测未来目标数据zongy = y[0:b]return xunlianx,xunliany,zongx,zongy
xunlianx,xunliany,zongx,zongy = pianyi(k)#对数据进行最大最小值归一化
x_scaler=MinMaxScaler(feature_range=(-1,1))
y_scaler=MinMaxScaler(feature_range=(-1,1))
zongx1 = MinMaxScaler(feature_range=(-1,1))x=x_scaler.fit_transform(xunlianx)
y=y_scaler.fit_transform(xunliany)
zongx2 = zongx1.fit_transform(zongx)#对样本进行转置,矩阵运算
sample_in=x.T
sample_out=y.T
zongx2 = zongx2.T#BP神经网络网络参数
max_epochs=60000 #循环迭代次数
learn_rate=0.001 #学习率
mse_final=6.5e-4 #设置一个均方误差的阈值,小于它则停止迭代
sample_number=xunlianx.shape[0] #样本数
input_number=xunlianx.shape[1] #输入特征数
output_number=xunliany.shape[1] #输出目标个数
hidden_units=12 #隐含层神经元个数
print(sample_number,input_number,output_number)#定义激活函数Sigmod
# import math
def sigmoid(z):return 1/(1+np.exp(-z))def sigmoid_delta(z): #偏导数return 1/((1+np.exp(-z))**2)*np.exp(-z)print(sigmoid(0),sigmoid_delta(0))#一层隐含层
#W1矩阵:M行N列,M等于该层神经元个数,N等于输入特征个数
W1=0.5*np.random.rand(hidden_units,input_number)-0.1
b1=0.5*np.random.rand(hidden_units,1)-0.1W2=0.5*np.random.rand(output_number,hidden_units)-0.1
b2=0.5*np.random.rand(output_number,1)-0.1mse_history=[] #空列表,存储迭代的误差
#不设置激活函数
for i in range(max_epochs):#FPhidden_out=sigmoid(np.dot(W1,sample_in)+b1) #np.dot矩矩阵相乘,hidden_out1结果为8行20列network_out=np.dot(W2,hidden_out)+b2 #np.dot矩阵相乘,W2是2行8列,则output结果是2行20列#误差err=sample_out-network_outmse_err=np.average(np.square(err)) #均方误差mse_history.append(mse_err)if mse_err<mse_final:break#BP#误差向量delta2=-err #最后一层的误差delta1=np.dot(W2.transpose(),delta2)*sigmoid_delta(hidden_out) #前一层的误差向量,这一层对hidden_out用了sigmoid激活函数,要对hidden_out求偏导数;注意最后一步是两个矩阵的点乘,是两个完全相同维度矩阵#梯度:损失函数的偏导数delta_W2=np.dot(delta2,hidden_out.transpose())delta_W1=np.dot(delta1,sample_in.transpose())delta_b2=np.dot(delta2,np.ones((sample_number,1)))delta_b1=np.dot(delta1,np.ones((sample_number,1)))W2-=learn_rate*delta_W2b2-=learn_rate*delta_b2W1-=learn_rate*delta_W1b1-=learn_rate*delta_b1#模型预测输出和实际输出对比图
hidden_out=sigmoid(np.dot(W1,sample_in)+b1)
network_out=np.dot(W2,hidden_out)+b2
#反转获取实际值:
network_out=y_scaler.inverse_transform(network_out.T)
sample_out=y_scaler.inverse_transform(y)
#zongx2
hidden_out3 = sigmoid(np.dot(W1,zongx2)+b1)
network_out3 = np.dot(W2,hidden_out3)+b2
network_out3 = y_scaler.inverse_transform(network_out3.T)#损失值画图
p1 = plt.figure(figsize=(12, 12))
pip1 = p1.add_subplot(2, 2, 1)
#print(mse_history)
loss=np.log10(mse_history)
min_mse=min(loss)
plt.plot(loss,label='loss')
plt.plot([0,len(loss)],[min_mse,min_mse],label='min_mse')
plt.xlabel('iteration')
plt.ylabel('MSE loss')
plt.title('Log10 MSE History',fontdict={'fontsize':18,'color':'red'})
plt.legend()#解决中文无法显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = Falseb = len(network_out3)
time = np.linspace(k,b,b-k)
print(k,b,b-k)
pip2 = p1.add_subplot(2, 2, 2)
plt.plot(time,network_out[:,0],label='pred')
plt.plot(time,xunliany,'r.',label='actual')
plt.xlim()
plt.title('用水量(训练过程) ',)
plt.legend()pip = p1.add_subplot(2,2,3)
hk = np.linspace(0,b,b)
plt.plot(hk,network_out3[:,0],label='pred')
plt.plot(time,xunliany,'r.',label='actual')
plt.title('用水量(预测过程)')
plt.legend()
plt.show()#最终预测结果保存在network_out3
b = len(network_out3)
print("在偏移对应训练下的(k到k+a)年预测结果:",network_out3)
print("在偏移对应训练下往后",k,"年预测结果:")
for i in range(k):print(network_out3[b-k+i][0],end=",")
数据格式:
全年平均日照 | 可支配收入 | 人户 | 发电量 | 实际居民用电量 | 用水量 | |
1999 | 840.5 | 5589 | 520.21 | 30.51 | 312980 | 5545 |
2000 | 842.1 | 6223 | 518.36 | 33.68 | 306900 | 5376 |
2001 | 1072.1 | 6543 | 520.16 | 37.82 | 367864 | 5614 |
2002 | 1140.1 | 7042 | 521.86 | 50.02 | 451943 | 5372 |
2003 | 972.9 | 7179 | 527.52 | 62.28 | 393755 | 6262 |
2004 | 990 | 7708 | 529.07 | 65.25 | 427215 | 7191 |
2005 | 1147.3 | 8201 | 530.71 | 71.22 | 540428 | 7191 |
2006 | 941.5 | 9054 | 533.30 | 85.23 | 561570 | 7404 |
2007 | 1321.8 | 10473 | 537.95 | 74.09 | 622800 | 7523 |
2008 | 1177.8 | 12200 | 540.71 | 60.48 | 652500 | 7593 |
2009 | 1218.2 | 13701 | 544.65 | 76.73 | 684846 | 7637 |
2010 | 10030.5 | 15516 | 541.87 | 90.69 | 700724 | 7695 |
2011 | 953.1 | 17998 | 543.36 | 91.48 | 730771 | 7731 |
2012 | 1201 | 20775 | 545.40 | 92.43 | 874755 | 8386 |
2013 | 1071.1 | 23100 | 547.38 | 97.60 | 839934 | 8943 |
2014 | 1490 | 25341 | 548.78 | 97.60 | 920299 | 9177 |
2015 | 1021.5 | 27170 | 545.48 | 99.3 | 945717 | 9787 |
2016 | 1233.4 | 29407 | 545.18 | 101.5 | 965165 | 10356 |
2017 | 1294.2 | 31822 | 536.82 | 102.6 | 995815 | 10986 |
2018 | 1274.2 | 34411 | 536.20 | 104.8 | 1070855 | 11065 |
2019 | 1468 | 37454 | 531.29 | 106.7 | 1181301 | 12223 |
2020 | 1054.6 | 39680 | 528.51 | 110.8 | 1283382 | 12604 |
2021 | 1257.8 | 42107 | 537.4 | 114.1 | 1289008 | 13164 |
BP神经网络如何用历史数据预测未来数据相关推荐
- 根据历史数据预测未来数据_速递!从真实世界到未来预测,从ESC最新研究数据看SPC降压地位...
编者按 ESC 2020会议线上热火朝天的开展,期间公布了多项降压的新研究,涵盖了从真实世界的数据分析到模拟未来的长期预测结果:此外,高血压作为高危因素之一,对于降压预防心血管事件又有哪些新进展?下面 ...
- 根据历史数据预测未来数据_未来销量预测——Kaggle基础方案(一):赛题背景和数据字段分析...
笔者将分享一次kaggle数据竞赛的实例,包括了数据竞赛的基本套路流程:赛题业务背景分析,数据探索(EDA),特征工程,单模预测(特征重要性分析)以及stacking模型融合. 本次赛题的链接: Pr ...
- python预测算整理集合 python根据历史数据,预测未来数据 神经网络时间序列预测python 销售收入分析与预测 神经网络预测控制 Python 源码 4个lstm做数据预测的案例源代码
python 预测未来/神经网络/负荷/飞机零件故障/链路预测程序源码 1.python实现TensorFlow2股票股价预测(源码) 2.负荷预测(py thon例子,实时负荷预测,15分钟到4小时 ...
- 【Matlab】基于多层前馈网络BP神经网络实现多分类预测(Excel可直接替换数据)
[Matlab]基于多层前馈网络BP神经网络实现多分类预测(Excel可直接替换数据) 1.算法简介 1.1 算法原理 1.2 算法流程 2.测试数据集 3.替换数据 4.混淆矩阵 5.对比结果 6. ...
- matlab耀输,基于 Matlab的BP神经网络在太阳耀斑级别预测中的应用
第 42卷 第 3期 2014年 5月 河南师范大学学报(自然科学版) Journal of Henan Normal University(Natural Science Edition) Z.42 ...
- (文章复现)5.基于BP神经网络的风电功率预测方法(MATLAB程序)
复现文章: 基于BP神经网络的风电功率预测方法--刘立群(2021年) 摘要: 风电功率预测结果的准确性,不仅关系到风力发电厂的综合运行效率,也与区域运行成本具备直接联系,为解决传统预测方法的不足,基 ...
- 基于BP神经网络的足球结果预测软件开发
基于BP神经网络的足球结果预测软件开发 一.问题描述 足球,被称为世界第一运动.足球比赛充满了对抗.力量.激情,比赛过程跌宕起伏,结果难以预测.随着人工智能时代的 到来,越来越多的人期望于将智能算法应 ...
- bp神经网络预测未来数据,bp神经网络数据预处理
如何建立bp神经网络预测 模型 建立BP神经网络预测 模型,可按下列步骤进行:1.提供原始数据2.训练数据预测数据提取及归一化3.BP网络训练4.BP网络预测5.结果分析现用一个实际的例子,来预测20 ...
- 图神经网络时间序列预测,神经网络预测未来数据
1.神经网络预测值为何全相同 最大的可能性是没有归一化.具体原因见下: 下面这个是经典的Sigmoid函数的曲线图: 如果不进行归一化,则过大的输入x将会导致Sigmoid函数进入平坦区,全部趋近于1 ...
最新文章
- Java面试集合(二)
- Use Case 和User Story
- ubuntu16.04下面用sublime运行scala代码
- 【教程】minicom使用教程
- 计算机上没有office2010,《我安装了office2010,为什么桌面-右键-新建中没有excel呢?》 excel文件找不到...
- 最新数据:中国网民超10亿,中老年群体增速最快
- gp3688写频线制作_摩托罗拉GP3688写频软件
- WEB前端开发书籍推荐
- matlab中的hold on/off、grid on/off 命令使用方法
- H5与SCC3的新特性
- HTML学习(三):排版
- win7 计算机 只有硬盘分区,电脑只有一个C盘怎么办?一招教你正确分区!-win7磁盘分区...
- 笔记本电脑查看电池损耗
- 分治法--处理数列问题
- 唐诗页面爬取 --- 预研阶段
- C++中的exit()函数
- 系统克隆 机械硬盘无缝迁移到ssd
- 算法的时间复杂度比较,计算多项式的直接法和秦九韶法
- 在德国注册商标的两种途径
- 怎样在手机自带的邮件服务器,如何在手机上收发学校邮箱信件