BP神经网络如何用历史数据预测未来数据

article/2025/10/8 11:53:06

本文主要为了解决如何用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=",")

 数据格式:

全年平均日照可支配收入人户发电量实际居民用电量用水量
1999840.55589520.2130.513129805545
2000842.16223518.3633.683069005376
20011072.16543520.1637.823678645614
20021140.17042521.8650.024519435372
2003972.97179527.5262.283937556262
20049907708529.0765.254272157191
20051147.38201530.7171.225404287191
2006941.59054533.3085.235615707404
20071321.810473537.9574.096228007523
20081177.812200540.7160.486525007593
20091218.213701544.6576.736848467637
201010030.515516541.8790.697007247695
2011953.117998543.3691.487307717731
2012120120775545.4092.438747558386
20131071.123100547.3897.608399348943
2014149025341548.7897.609202999177
20151021.527170545.4899.39457179787
20161233.429407545.18101.596516510356
20171294.231822536.82102.699581510986
20181274.234411536.20104.8107085511065
2019146837454531.29106.7118130112223
20201054.639680528.51110.8128338212604
20211257.842107537.4114.1128900813164


http://chatgpt.dhexx.cn/article/ol7xApsh.shtml

相关文章

EXCEL生成脚本

Execel 业务导入 1、填写数据 2、根据包的存储过程&#xff0c;生成脚本 3、输出脚本

用Python如何开发Excel宏脚本?新手必学

今天介绍一个叫 xlpython 的库&#xff0c;通过它我们可以用 Python 来开发 Excel 的宏脚本&#xff0c;真正实现在 Excel 中调用 Python。 基本环境 操作系统&#xff1a;Windows 10 x64 Office&#xff1a;2016 安装Python 1.下载Python安装包 登录[https://www.python…

大新闻!微软正考虑添加 Python 为官方的 Excel 脚本语言

(点击上方蓝字&#xff0c;快速关注我们) 来源&#xff1a; 开源中国 www.oschina.net/news/91595/python-as-an-official-scripting-language-to-excel 据外媒报道&#xff0c;微软正考虑添加 Python 为官方的一种 Excel 脚本语言&#xff0c;如果获得批准&#xff0c;Excel 用…

Excel里写VB脚本自定义函数

1点击开发者工具&#xff0c;选择Visual Basic 2选择插入模块 3如图写入如下脚本 str为需要匹配的字符串,exist表示存在的符号,uexist表示不存在的符号,SearchString合法字符集集合 函数功能&#xff1a;遍历str中每个字符,如果有任一字符存在于SearchString中&#xff0c;则显…

Excel 数据转化为Sql脚本

在实际项目开发中&#xff0c;有时会遇到客户让我们把大量Excel数据导入数据库的情况。这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库。 步骤一&#xff1a;在数据前插入一列单元格&#xff0c;用来拼写sql语句。 "insert into t_order (id,name,kg,v) v…

根据excel生成mysql数据库,根据excel生成数据库脚本

怎么在Excel里面学脚本连接SQL数据库生成报表 怎么在Excel里面学脚本连接SQL数据库生成报表现在需要对几个模拟量做报楼主,用office2013吧,现成的连接sql,简单易用。 怎么在oracle下写一个脚本,导出表数据为EXCEL格式无法直接保存到excel中,但是可以保存到csv文件,同样是…

如何使用Python脚本合并多个Excel文件

merge 由于工作需要&#xff0c;客户需要将多个excel文件合并成一个excel中&#xff0c;之前也没有接触过python。于是上网查找&#xff0c;大概学了一下&#xff0c;折腾了一下午&#xff0c;终于并实现了该功能&#xff0c;在这里总结一下&#xff0c;分享出来供大家参考。 …

Python3 编写处理Excel表格数据筛选脚本用到的一些方法

记录下之前用python3 写的一个处理Excel表格数据筛选脚本用到的一些方法。 本文内容比较杂&#xff0c;可按需跳转翻看。 pandas是一个内容十分丰富的库&#xff0c;我也只不过用到其中处理excel的方法&#xff0c;对这个库感兴趣的可以直接翻阅pandas官方文档&#xff0c;对…

Xmind转换Excel

简介:支持批量读取Xmind文件生成Excel表格,实现每列相同数值进行宽度自适应并合并居中; 1、Xmind格式如下图所示: 2、表格效果如图所示: #!/usr/bin/env python # -*- coding: utf-8 -*- import os import pandas as pd import openpyxl from openpyxl.styles import…

Sql 脚本导入EXCEL数据

Sql 脚本导入EXCEL数据 1 delete excel 2 3 -- 讀取EXCLE表數 4 SELECT e_mail excel FROM OPENDATASOURCE ( Microsoft.Jet.OLEDB.4.0 , 5 Data SourceC:\Documents and Settings\geovindu\桌面\vip平常按排工作\2010-06-18\2010-06-18.xls;Extended PropertiesExce…

Excel与DBC互转脚本(基于MATLAB)

Excel与DBC互转脚本&#xff08;基于MATLAB&#xff09; Excel与DBC互转脚本&#xff0c;有了这个脚本&#xff0c;可以自动把excel的通信协议转换为标准dbc文件&#xff0c;减少工作量&#xff0c;不会造成因手工制作DBC文件会出现问题而难以检查的风险。 转换脚本基于MATLAB编…

jmeter开发导入excel脚本

测试过程中&#xff0c;经常需要对导入excel进行性能、自动化测试&#xff0c;很多导入脚本并不支持录制功能&#xff0c;只能通过抓包方式获取请求参数&#xff0c;然后在手工开发脚本&#xff0c;由于很多同学可能对导入这块没有实际操作经验&#xff0c;开发起来会很困难&am…

脚本 - EXCEL

一个EXCEL表格&#xff0c;有108行的数据&#xff08;也就是有108个地区&#xff09;和12个属性&#xff0c;画ECharts图时获取数据很麻烦&#xff0c;相比之下写脚本处理数据就很方便了。 基本使用 import xlrd #读取EXCEL#打开EXCEL文件 data xlrd.open_workbook(rD:\tryex…

excel内容合并脚本

README 脚本中环境变量改成自己实际得环境变量 pathos.chdir(r’D:\工作\pythonProject\合并excel\合并’) #需要合并得excel savefile “D:/工作/pythonProject/合并excel/test.csv” #合并后保存得位置 文件名自定义 sheet_name ‘20220527’ #要合并得sheet 合并前后对比…

Excel 脚本编写

本页内容 使用 Excel&#xff1a;快速回顾将数据添加到电子表格中Excel 中的格式设置使用范围数据排序哦&#xff0c;真的是这样&#xff1a;从 Active Directory 中提取数据就这些吗&#xff1f; 我猜测当您自称为 Microsoft Scripting Guy 并撰写名为脚本编写门诊 (Scripti…

运行 Excel 脚本

目的 Excel 模板生成一个 Excel 电子表格。它还将生成一个脚本&#xff0c;该脚本可以将数据从该电子表格传输到 SAP。包括错误处理&#xff0c;使您能够在将数据传输到 SAP 之前更正任何错误。要运行Excel脚本&#xff0c;请执行以下操作。 用户界面 查找生成的工作台脚本。…

分享2个Python处理Excel的脚本

一、写在前面 来源于两个读者的学习/工作需求&#xff0c;很巧&#xff0c;这两个读者提的需求都是关于批量合并sheet&#xff08;检索需要的信息&#xff09;。 本文所用数据样式&#xff0c;经读者同意&#xff0c;可以公开&#xff0c;文件中的数据为Excel中的Rand函数生成…

热烈祝贺我公司获得“渣土车智慧监控平台软件著作权登记证书”

根据《中华人民共和国计算机软件保护条例》和《计算机软件著作权登记办法》的规定&#xff0c;经中华人民共和国国家版权局审定&#xff0c;我公司自主研发的——“索迪迈渣土运输管理平台V1.0”的软件&#xff0c;被正式授予《中华人民共和国国家版权局计算机软件著作权登记证…

热烈祝贺公司获得“采砂智能监控管理平台”计算机软著权登记证书

热烈祝贺我司荣获计算机软件著作权登记证书。我司一直十分注重产品研发工作&#xff0c;我们坚信技术创新是公司生存的基础&#xff0c;科技发展是企业腾飞的平台。 这次计算机软件著作权登记证书的获得有利于公司进一步完善知识产权保护体系&#xff0c;形成持续创新机制&…

10万+标注数据开放!驾驶员不良驾驶识别/电动车进电梯检测/渣土车车牌识别/反光衣识别等8大赛题详解来了!...

ECV-2021极市计算机视觉开发者榜单大赛&#xff08;以下简称ECV-2021&#xff09;已于2021年7月6日正式开赛&#xff01; ECV-2021由青岛市人民政府指导&#xff0c;极视角科技有限公司、 青岛市委台港澳办、青岛市工业和信息化局、青岛西海岸新区管委和青岛市城市管理局主办&a…