我的编程空间,编程开发者的网络收藏夹
学习永远不晚

BP神经网络预测(python)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

BP神经网络预测(python)

可以参考新发布的文章
1.mlp多层感知机预测(python)
2.lstm时间序列预测+GRU(python)
下边是基于Python的简单的BP神经网络预测,多输入单输出,也可以改成多输入多输出,下边是我的数据,蓝色部分预测红色(x,y,v为自变量,z为因变量)
数据集下载链接1,点击下载
数据集下载链接2(github),点击下载
数据
话不多说,直接上代码,具体实现在代码里有注释

# -*- coding: utf-8 -*-import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport BPNNfrom sklearn import metricsfrom sklearn.metrics import mean_absolute_errorfrom sklearn.metrics import mean_squared_errordef inverse_transform_col(scaler,y,n_col):    '''scaler是对包含多个feature的X拟合的,y对应其中一个feature,n_col为y在X中对应的列编号.返回y的反归一化结果'''    y = y.copy()    y -= scaler.min_[n_col]    y /= scaler.scale_[n_col]    return y    #导入必要的库df1=pd.read_excel('2000.xls',0)df1=df1.iloc[:,:]#进行数据归一化from sklearn import preprocessingmin_max_scaler = preprocessing.MinMaxScaler()df0=min_max_scaler.fit_transform(df1)df = pd.DataFrame(df0, columns=df1.columns)x=df.iloc[:,:-1]y=df.iloc[:,-1]#划分训练集测试集cut=300#取最后cut=30天为测试集x_train, x_test=x.iloc[:-cut],x.iloc[-cut:]#列表的切片操作,X.iloc[0:2400,0:7]即为1-2400行,1-7列y_train, y_test=y.iloc[:-cut],y.iloc[-cut:]x_train, x_test=x_train.values, x_test.valuesy_train, y_test=y_train.values, y_test.values#神经网络搭建bp1 = BPNN.BPNNRegression([3, 16, 1])train_data = [[sx.reshape(3,1), sy.reshape(1,1)] for sx, sy in zip(x_train, y_train)]test_data = [np.reshape(sx, (3,1)) for sx in x_test]#神经网络训练bp1.MSGD(train_data, 60000, len(train_data), 0.2)#神经网络预测y_predict=bp1.predict(test_data)y_pre = np.array(y_predict)  # 列表转数组y_pre=y_pre.reshape(300,1)y_pre=y_pre[:,0]#y_pre = min_max_scaler.inverse_transform(y_pre)y_pre=inverse_transform_col(min_max_scaler,y_pre,n_col=0)      # 对预测值反归一化y_test=inverse_transform_col(min_max_scaler,y_test,n_col=0)    # 对实际值反归一化(如果不想用,这两行删除即可)#画图 #展示在测试集上的表现draw=pd.concat([pd.DataFrame(y_test),pd.DataFrame(y_pre)],axis=1);draw.iloc[:,0].plot(figsize=(12,6))draw.iloc[:,1].plot(figsize=(12,6))plt.legend(('real', 'predict'),loc='upper right',fontsize='15')plt.title("Test Data",fontsize='30') #添加plt.show()#输出精度指标print('测试集上的MAE/MSE')print(mean_absolute_error(y_pre, y_test))print(mean_squared_error(y_pre, y_test) )mape = np.mean(np.abs((y_pre-y_test)/(y_test)))*100print('=============mape==============')print(mape,'%')# 画出真实数据和预测数据的对比曲线图print("R2 = ",metrics.r2_score(y_test, y_pre)) # R2

下边是神经网络内部结构,文件名命名为 BPNN.py

# encoding:utf-8'''BP神经网络Python实现'''import randomimport numpy as npdef sigmoid(x):    '''    激活函数    '''    return 1.0 / (1.0 + np.exp(-x))def sigmoid_prime(x):    return sigmoid(x) * (1 - sigmoid(x))class BPNNRegression:    '''    神经网络回归与分类的差别在于:    1. 输出层不需要再经过激活函数    2. 输出层的 w 和 b 更新量计算相应更改    '''    def __init__(self, sizes):        # 神经网络结构        self.num_layers = len(sizes)        self.sizes = sizes        # 初始化偏差,除输入层外, 其它每层每个节点都生成一个 biase 值(0-1)        self.biases = [np.random.randn(n, 1) for n in sizes[1:]]        # 随机生成每条神经元连接的 weight 值(0-1)        self.weights = [np.random.randn(r, c)                        for c, r in zip(sizes[:-1], sizes[1:])]            def feed_forward(self, a):        '''        前向传输计算输出神经元的值        '''        for i, b, w in zip(range(len(self.biases)), self.biases, self.weights):            # 输出神经元不需要经过激励函数            if i == len(self.biases) - 1:                a = np.dot(w, a) + b                break            a = sigmoid(np.dot(w, a) + b)        return a        def MSGD(self, training_data, epochs, mini_batch_size, eta, error = 0.01):        '''        小批量随机梯度下降法        '''        n = len(training_data)        for j in range(epochs):            # 随机打乱训练集顺序            random.shuffle(training_data)            # 根据小样本大小划分子训练集集合            mini_batchs = [training_data[k:k+mini_batch_size]for k in range(0, n, mini_batch_size)]            # 利用每一个小样本训练集更新 w 和 b            for mini_batch in mini_batchs:                self.updata_WB_by_mini_batch(mini_batch, eta)                        #迭代一次后结果            err_epoch = self.evaluate(training_data)            print("Epoch {0} Error {1}".format(j, err_epoch))            if err_epoch < error:                break            # if test_data:            #     print("Epoch {0}: {1} / {2}".format(j, self.evaluate(test_data), n_test))            # else:            # print("Epoch {0}".format(j))        return err_epoch        def updata_WB_by_mini_batch(self, mini_batch, eta):        '''        利用小样本训练集更新 w 和 b        mini_batch: 小样本训练集        eta: 学习率        '''        # 创建存储迭代小样本得到的 b 和 w 偏导数空矩阵,大小与 biases 和 weights 一致,初始值为 0           batch_par_b = [np.zeros(b.shape) for b in self.biases]        batch_par_w = [np.zeros(w.shape) for w in self.weights]        for x, y in mini_batch:            # 根据小样本中每个样本的输入 x, 输出 y, 计算 w 和 b 的偏导            delta_b, delta_w = self.back_propagation(x, y)            # 累加偏导 delta_b, delta_w             batch_par_b = [bb + dbb for bb, dbb in zip(batch_par_b, delta_b)]            batch_par_w = [bw + dbw for bw, dbw in zip(batch_par_w, delta_w)]        # 根据累加的偏导值 delta_b, delta_w 更新 b, w        # 由于用了小样本,因此 eta 需除以小样本长度        self.weights = [w - (eta / len(mini_batch)) * dw                        for w, dw in zip(self.weights, batch_par_w)]        self.biases = [b - (eta / len(mini_batch)) * db                        for b, db in zip(self.biases, batch_par_b)]    def back_propagation(self, x, y):        '''        利用误差后向传播算法对每个样本求解其 w 和 b 的更新量        x: 输入神经元,行向量        y: 输出神经元,行向量                '''        delta_b = [np.zeros(b.shape) for b in self.biases]        delta_w = [np.zeros(w.shape) for w in self.weights]        # 前向传播,求得输出神经元的值        a = x # 神经元输出值        # 存储每个神经元输出        activations = [x]         # 存储经过 sigmoid 函数计算的神经元的输入值,输入神经元除外        zs = []        for b, w in zip(self.biases, self.weights):            z = np.dot(w, a) + b            zs.append(z)            a = sigmoid(z) # 输出神经元            activations.append(a)        #-------------        activations[-1] = zs[-1] # 更改神经元输出结果        #-------------        # 求解输出层δ        # 与分类问题不同,Delta计算不需要乘以神经元输入的倒数        #delta = self.cost_function(activations[-1], y) * sigmoid_prime(zs[-1])        delta = self.cost_function(activations[-1], y) #更改后        #-------------        delta_b[-1] = delta        delta_w[-1] = np.dot(delta, activations[-2].T)        for lev in range(2, self.num_layers):            # 从倒数第1层开始更新,因此需要采用-lev            # 利用 lev + 1 层的 δ 计算 l 层的 δ             z = zs[-lev]            zp = sigmoid_prime(z)            delta = np.dot(self.weights[-lev+1].T, delta) * zp            delta_b[-lev] = delta            delta_w[-lev] = np.dot(delta, activations[-lev-1].T)        return (delta_b, delta_w)        def evaluate(self, train_data):        test_result = [[self.feed_forward(x), y]                        for x, y in train_data]        return np.sum([0.5 * (x - y) ** 2 for (x, y) in test_result])        def predict(self, test_input):        test_result = [self.feed_forward(x)                        for x in test_input]        return test_result    def cost_function(self, output_a, y):        '''        损失函数        '''        return (output_a - y)    pass

下边是我训练10000次得出的结果图
Mape=3.8747546777023055 %
R2 = 0.9892761559285088

未进行反归一化的效果图:
请添加图片描述
反归一化的效果图:
在这里插入图片描述

代码打包下载:https://download.csdn.net/download/qq_45077760/87708534
可以加群:1029655667,进行沟通交流

来源地址:https://blog.csdn.net/qq_45077760/article/details/124508235

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

BP神经网络预测(python)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中如何进行基于BP神经网络的预测

今天就跟大家聊聊有关Python中如何进行基于BP神经网络的预测,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、Introduction1 BP神经网络的优点非线性映射能力:BP神
2023-06-26

pytorch怎么实现bp神经网络

要在PyTorch中实现一个BP神经网络,需要遵循以下步骤:定义神经网络结构:首先,需要定义神经网络的结构,包括输入层、隐藏层和输出层的神经元数量。可以通过继承nn.Module类来定义一个自定义的神经网络模型。import torchi
pytorch怎么实现bp神经网络
2024-04-08

用Python神经网络预测汽车保险支出

在本教程中,您将发现如何为瑞典汽车保险回归数据集开发多层Perceptron神经网络模型。

如何在python中使用Tensorflow训练BP神经网络

如何在python中使用Tensorflow训练BP神经网络?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用软件Python 3.8,Tensorflow2.0问题描述鸢
2023-06-15

怎么用Python神经网络预测汽车保险支出

本篇内容主要讲解“怎么用Python神经网络预测汽车保险支出”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python神经网络预测汽车保险支出”吧!为新数据集开发神经网络预测模型可能具有挑
2023-06-15

利用 LSTM 神经网络预测股价走势

长短期记忆 (LSTM) 神经网络属于循环神经网络 (RNN) 的一种,特别适合处理和预测与时间序列相关的重要事件。

深度学习神经网络的预测间隔

通常,用于回归问题的预测模型(即预测数值)进行点预测。这意味着他们可以预测单个值,但不能提供任何有关该预测的不确定性的指示。根据定义,预测是估计值或近似值,并且包含一些不确定性。

python 使用Tensorflow训练BP神经网络实现鸢尾花分类

Hello,兄弟们,开始搞深度学习了,今天出第一篇博客,小白一枚,如果发现错误请及时指正,万分感谢。 使用软件Python 3.8,Tensorflow2.0 问题描述鸢尾花主要分为狗尾草鸢尾(0)、杂色鸢尾(1)、弗吉尼亚鸢尾(2)。 人
2022-06-02

Python中LSTM回归神经网络时间序列如何预测

这篇文章主要介绍“Python中LSTM回归神经网络时间序列如何预测”,在日常操作中,相信很多人在Python中LSTM回归神经网络时间序列如何预测问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录