本文主要为了解决如何用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神经网络如何用历史数据预测未来数据相关推荐

  1. 根据历史数据预测未来数据_速递!从真实世界到未来预测,从ESC最新研究数据看SPC降压地位...

    编者按 ESC 2020会议线上热火朝天的开展,期间公布了多项降压的新研究,涵盖了从真实世界的数据分析到模拟未来的长期预测结果:此外,高血压作为高危因素之一,对于降压预防心血管事件又有哪些新进展?下面 ...

  2. 根据历史数据预测未来数据_未来销量预测——Kaggle基础方案(一):赛题背景和数据字段分析...

    笔者将分享一次kaggle数据竞赛的实例,包括了数据竞赛的基本套路流程:赛题业务背景分析,数据探索(EDA),特征工程,单模预测(特征重要性分析)以及stacking模型融合. 本次赛题的链接: Pr ...

  3. python预测算整理集合 python根据历史数据,预测未来数据 神经网络时间序列预测python 销售收入分析与预测 神经网络预测控制 Python 源码 4个lstm做数据预测的案例源代码

    python 预测未来/神经网络/负荷/飞机零件故障/链路预测程序源码 1.python实现TensorFlow2股票股价预测(源码) 2.负荷预测(py thon例子,实时负荷预测,15分钟到4小时 ...

  4. 【Matlab】基于多层前馈网络BP神经网络实现多分类预测(Excel可直接替换数据)

    [Matlab]基于多层前馈网络BP神经网络实现多分类预测(Excel可直接替换数据) 1.算法简介 1.1 算法原理 1.2 算法流程 2.测试数据集 3.替换数据 4.混淆矩阵 5.对比结果 6. ...

  5. matlab耀输,基于 Matlab的BP神经网络在太阳耀斑级别预测中的应用

    第 42卷 第 3期 2014年 5月 河南师范大学学报(自然科学版) Journal of Henan Normal University(Natural Science Edition) Z.42 ...

  6. (文章复现)5.基于BP神经网络的风电功率预测方法(MATLAB程序)

    复现文章: 基于BP神经网络的风电功率预测方法--刘立群(2021年) 摘要: 风电功率预测结果的准确性,不仅关系到风力发电厂的综合运行效率,也与区域运行成本具备直接联系,为解决传统预测方法的不足,基 ...

  7. 基于BP神经网络的足球结果预测软件开发

    基于BP神经网络的足球结果预测软件开发 一.问题描述 足球,被称为世界第一运动.足球比赛充满了对抗.力量.激情,比赛过程跌宕起伏,结果难以预测.随着人工智能时代的 到来,越来越多的人期望于将智能算法应 ...

  8. bp神经网络预测未来数据,bp神经网络数据预处理

    如何建立bp神经网络预测 模型 建立BP神经网络预测 模型,可按下列步骤进行:1.提供原始数据2.训练数据预测数据提取及归一化3.BP网络训练4.BP网络预测5.结果分析现用一个实际的例子,来预测20 ...

  9. 图神经网络时间序列预测,神经网络预测未来数据

    1.神经网络预测值为何全相同 最大的可能性是没有归一化.具体原因见下: 下面这个是经典的Sigmoid函数的曲线图: 如果不进行归一化,则过大的输入x将会导致Sigmoid函数进入平坦区,全部趋近于1 ...

最新文章

  1. Java面试集合(二)
  2. Use Case 和User Story
  3. ubuntu16.04下面用sublime运行scala代码
  4. 【教程】minicom使用教程
  5. 计算机上没有office2010,《我安装了office2010,为什么桌面-右键-新建中没有excel呢?》 excel文件找不到...
  6. 最新数据:中国网民超10亿,中老年群体增速最快
  7. gp3688写频线制作_摩托罗拉GP3688写频软件
  8. WEB前端开发书籍推荐
  9. matlab中的hold on/off、grid on/off 命令使用方法
  10. H5与SCC3的新特性
  11. HTML学习(三):排版
  12. win7 计算机 只有硬盘分区,电脑只有一个C盘怎么办?一招教你正确分区!-win7磁盘分区...
  13. 笔记本电脑查看电池损耗
  14. 分治法--处理数列问题
  15. 唐诗页面爬取 --- 预研阶段
  16. C++中的exit()函数
  17. 系统克隆 机械硬盘无缝迁移到ssd
  18. 算法的时间复杂度比较,计算多项式的直接法和秦九韶法
  19. 在德国注册商标的两种途径
  20. 怎样在手机自带的邮件服务器,如何在手机上收发学校邮箱信件

热门文章

  1. 是哪一瞬间让后端们决定入职的?
  2. 2021年全球离心给料机行业调研及趋势分析报告
  3. Java深入学习并发原理总结
  4. 趋势科技2月移动客户端病毒报告
  5. Javascript收藏
  6. MFC内部运行来龙去脉追踪
  7. 用python画目标的外轮廓线(含python代码)
  8. 【 Linux 】重启 docker 容器
  9. vue数组刷新_详解VUE 数组更新
  10. jrebel安装激活