【Python数学建模常用算法代码(二)之BP神经网络】
Python数学建模常用算法代码(二)
BP神经网络模型Python代码
import numpy as np
import math
import random
import string
import matplotlib as mpl
import matplotlib.pyplot as plt#random.seed(0) #当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数#参考https://blog.csdn.net/jiangjiang_jian/article/details/79031788#生成区间[a,b]内的随机数
def random_number(a,b):return (b-a)*random.random()+a#生成一个矩阵,大小为m*n,并且设置默认零矩阵
def makematrix(m, n, fill=0.0):a = []for i in range(m):a.append([fill]*n)return a#函数sigmoid(),这里采用tanh,因为看起来要比标准的sigmoid函数好看
def sigmoid(x):return math.tanh(x)#函数sigmoid的派生函数
def derived_sigmoid(x):return 1.0 - x**2#构造三层BP网络架构
class BPNN:def __init__(self, num_in, num_hidden, num_out):#输入层,隐藏层,输出层的节点数self.num_in = num_in + 1 #增加一个偏置结点self.num_hidden = num_hidden + 1 #增加一个偏置结点self.num_out = num_out#激活神经网络的所有节点(向量)self.active_in = [1.0]*self.num_inself.active_hidden = [1.0]*self.num_hiddenself.active_out = [1.0]*self.num_out#创建权重矩阵self.wight_in = makematrix(self.num_in, self.num_hidden)self.wight_out = makematrix(self.num_hidden, self.num_out)#对权值矩阵赋初值for i in range(self.num_in):for j in range(self.num_hidden):self.wight_in[i][j] = random_number(-0.2, 0.2)for i in range(self.num_hidden):for j in range(self.num_out):self.wight_out[i][j] = random_number(-0.2, 0.2)#最后建立动量因子(矩阵)self.ci = makematrix(self.num_in, self.num_hidden)self.co = makematrix(self.num_hidden, self.num_out) #信号正向传播def update(self, inputs):if len(inputs) != self.num_in-1:raise ValueError('与输入层节点数不符')#数据输入输入层for i in range(self.num_in - 1):#self.active_in[i] = sigmoid(inputs[i]) #或者先在输入层进行数据处理self.active_in[i] = inputs[i] #active_in[]是输入数据的矩阵#数据在隐藏层的处理for i in range(self.num_hidden - 1):sum = 0.0for j in range(self.num_in):sum = sum + self.active_in[i] * self.wight_in[j][i]self.active_hidden[i] = sigmoid(sum) #active_hidden[]是处理完输入数据之后存储,作为输出层的输入数据#数据在输出层的处理for i in range(self.num_out):sum = 0.0for j in range(self.num_hidden):sum = sum + self.active_hidden[j]*self.wight_out[j][i]self.active_out[i] = sigmoid(sum) #与上同理return self.active_out[:]#误差反向传播def errorbackpropagate(self, targets, lr, m): #lr是学习率, m是动量因子if len(targets) != self.num_out:raise ValueError('与输出层节点数不符!')#首先计算输出层的误差out_deltas = [0.0]*self.num_outfor i in range(self.num_out):error = targets[i] - self.active_out[i]out_deltas[i] = derived_sigmoid(self.active_out[i])*error#然后计算隐藏层误差hidden_deltas = [0.0]*self.num_hiddenfor i in range(self.num_hidden):error = 0.0for j in range(self.num_out):error = error + out_deltas[j]* self.wight_out[i][j]hidden_deltas[i] = derived_sigmoid(self.active_hidden[i])*error#首先更新输出层权值for i in range(self.num_hidden):for j in range(self.num_out):change = out_deltas[j]*self.active_hidden[i]self.wight_out[i][j] = self.wight_out[i][j] + lr*change + m*self.co[i][j]self.co[i][j] = change#然后更新输入层权值for i in range(self.num_in):for i in range(self.num_hidden):change = hidden_deltas[j]*self.active_in[i]self.wight_in[i][j] = self.wight_in[i][j] + lr*change + m* self.ci[i][j]self.ci[i][j] = change#计算总误差error = 0.0for i in range(len(targets)):error = error + 0.5*(targets[i] - self.active_out[i])**2return error#测试def test(self, patterns):for i in patterns:print(i[0], '->', self.update(i[0]))#权重def weights(self):print("输入层权重")for i in range(self.num_in):print(self.wight_in[i])print("输出层权重")for i in range(self.num_hidden):print(self.wight_out[i])def train(self, pattern, itera=100000, lr = 0.1, m=0.1):for i in range(itera):error = 0.0for j in pattern:inputs = j[0]targets = j[1]self.update(inputs)error = error + self.errorbackpropagate(targets, lr, m)if i % 100 == 0:print('误差 %-.5f' % error)#实例
def demo():patt = [[[1,2,5],[0]],[[1,3,4],[1]],[[1,6,2],[1]],[[1,5,1],[0]],[[1,8,4],[1]]]#创建神经网络,3个输入节点,3个隐藏层节点,1个输出层节点n = BPNN(3, 3, 1)#训练神经网络n.train(patt)#测试神经网络n.test(patt)#查阅权重值n.weights()if __name__ == '__main__':demo()```
【Python数学建模常用算法代码(二)之BP神经网络】相关推荐
- 数学建模常用算法汇总及python,MATLAB实现(五) —— 拟合
拟合 比较重要的就是2.1和2.3 2.2可以浅看一下, 自己敲着试一试 就拟合部分来说, MATLAB比python强大很多, 自带cftool工具包, 并且有很多快速的函数, 个人建议使用MATL ...
- 数学建模常用算法汇总及python,MATLAB实现(六) —— pandas和matlab实现插值
插值 2的拉格朗日插值用的其实比较少, 可以看一下了解一下插值的原理 主要看看3里的结论和4的实现代码 文章目录 插值 1. 定义 2.拉格朗日插值 2.1 概念 3. Rouge现象 3.1 是什么 ...
- 二维动态规划降维误差一般为多少_数学建模常用算法模型
数学模型的分类 按模型的数学方法分: 几何模型.图论模型.微分方程模型.概率模型.最优控制模型.规划论模型.马氏链模型等 按模型的特征分: 静态模型和动态模型,确定性模型和随机模型,离散模型和连续性模 ...
- 【数学建模常用算法】之灰色预测模型GM
作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] 文章目录 一.灰色预测模型GM(1,1) 1.数据检验与数据预处理 1.1 构 ...
- 机器学习数据挖掘十大经典算法 数学建模常用算法
国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006 (香港召开)年12月评选出了数据挖掘领域的十大经典算法.不仅 ...
- 数学建模常用算法—灰色预测
今天数模君给大家讲解一下数学建模比赛中常用的一种预测方法:灰色预测法. 目录 模型的含义 灰色预测的原理 实例 模型的含义 灰色预测模型 ( Gray Forecast Model )是通过少量的.不 ...
- 数学建模常用算法—马尔可夫预测
今天数模君带大家学习一下数学建模中的预测算法之马尔科夫预测. 目录 模型的含义 实例分析 模型的含义 马尔可夫(Markov)预测法,就是一种关于事件发生的概率预测方法.它是根据事件的目前状况来预测其 ...
- 【数学建模】11 数学建模常用算法和计算机辅助软件
目录 1 常用数值计算方法 2 现代智能计算方法 2.1 分类 2.2 遗传算法 2.3 神经网络 3 科技计算软件 4 习题 1 常用数值计算方法 (1)解线性方程组的直接方法 • 高斯消去法(Ga ...
- 数学建模学习17(最短距离、BP神经网络)
第二篇2022.2.7 论文E2113869 用到的模型: 1.BP神经网络 2.Dijkstra algorithm 处理最短路径问题 Floyd算法 代码 clc,clear A=[0,1,4;1 ...
最新文章
- 机器学习:线性回归简单有效,但是千万不要踩到雷区!
- 1.5 卷积步长-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 【数据竞赛】十大重要的时间组合特征!
- ubuntu21.04安装微信3.2.1(deepin-wine方式)
- sess.run接收返回值得变量和sess.run函数內的tensor型变量命名注意不能一致,影响迭代,产生报错:Can not convert a ndarray into a Tensor
- Ubuntu下无法使用Secure_CRT连接服务器
- 面试总结之人工智能AI(Artificial Intelligence)/ 机器学习(Machine Learning)
- Magento2后台忘记密码
- 【java】创建一个线程,可以对其名称进行设置
- C++学习笔记(十二):重载函数
- 力扣-509 裴波那契数
- Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作
- SqlServer2008R2软件下载安装教程
- 2022年技术胖私藏工具分享
- Win10外接显示频黑屏解决
- 最新计算机cpu简介,电脑处理器性能排行榜 cpu天梯图介绍
- OpenCV图像处理基础(C++版)
- 蜂窝网通信平台建模说明
- 采集存储板第218篇:基于5VFX70T的3U VPX 光纤数据采集存储板
- C# 封面图片生成器