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神经网络】相关推荐

  1. 数学建模常用算法汇总及python,MATLAB实现(五) —— 拟合

    拟合 比较重要的就是2.1和2.3 2.2可以浅看一下, 自己敲着试一试 就拟合部分来说, MATLAB比python强大很多, 自带cftool工具包, 并且有很多快速的函数, 个人建议使用MATL ...

  2. 数学建模常用算法汇总及python,MATLAB实现(六) —— pandas和matlab实现插值

    插值 2的拉格朗日插值用的其实比较少, 可以看一下了解一下插值的原理 主要看看3里的结论和4的实现代码 文章目录 插值 1. 定义 2.拉格朗日插值 2.1 概念 3. Rouge现象 3.1 是什么 ...

  3. 二维动态规划降维误差一般为多少_数学建模常用算法模型

    数学模型的分类 按模型的数学方法分: 几何模型.图论模型.微分方程模型.概率模型.最优控制模型.规划论模型.马氏链模型等 按模型的特征分: 静态模型和动态模型,确定性模型和随机模型,离散模型和连续性模 ...

  4. 【数学建模常用算法】之灰色预测模型GM

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] 文章目录 一.灰色预测模型GM(1,1) 1.数据检验与数据预处理 1.1 构 ...

  5. 机器学习数据挖掘十大经典算法 数学建模常用算法

    国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006 (香港召开)年12月评选出了数据挖掘领域的十大经典算法.不仅 ...

  6. 数学建模常用算法—灰色预测

    今天数模君给大家讲解一下数学建模比赛中常用的一种预测方法:灰色预测法. 目录 模型的含义 灰色预测的原理 实例 模型的含义 灰色预测模型 ( Gray Forecast Model )是通过少量的.不 ...

  7. 数学建模常用算法—马尔可夫预测

    今天数模君带大家学习一下数学建模中的预测算法之马尔科夫预测. 目录 模型的含义 实例分析 模型的含义 马尔可夫(Markov)预测法,就是一种关于事件发生的概率预测方法.它是根据事件的目前状况来预测其 ...

  8. 【数学建模】11 数学建模常用算法和计算机辅助软件

    目录 1 常用数值计算方法 2 现代智能计算方法 2.1 分类 2.2 遗传算法 2.3 神经网络 3 科技计算软件 4 习题 1 常用数值计算方法 (1)解线性方程组的直接方法 • 高斯消去法(Ga ...

  9. 数学建模学习17(最短距离、BP神经网络)

    第二篇2022.2.7 论文E2113869 用到的模型: 1.BP神经网络 2.Dijkstra algorithm 处理最短路径问题 Floyd算法 代码 clc,clear A=[0,1,4;1 ...

最新文章

  1. 机器学习:线性回归简单有效,但是千万不要踩到雷区!
  2. 1.5 卷积步长-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. 【数据竞赛】十大重要的时间组合特征!
  4. ubuntu21.04安装微信3.2.1(deepin-wine方式)
  5. sess.run接收返回值得变量和sess.run函数內的tensor型变量命名注意不能一致,影响迭代,产生报错:Can not convert a ndarray into a Tensor
  6. Ubuntu下无法使用Secure_CRT连接服务器
  7. 面试总结之人工智能AI(Artificial Intelligence)/ 机器学习(Machine Learning)
  8. Magento2后台忘记密码
  9. 【java】创建一个线程,可以对其名称进行设置
  10. C++学习笔记(十二):重载函数
  11. 力扣-509 裴波那契数
  12. Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作
  13. SqlServer2008R2软件下载安装教程
  14. 2022年技术胖私藏工具分享
  15. Win10外接显示频黑屏解决
  16. 最新计算机cpu简介,电脑处理器性能排行榜 cpu天梯图介绍
  17. OpenCV图像处理基础(C++版)
  18. 蜂窝网通信平台建模说明
  19. 采集存储板第218篇:基于5VFX70T的3U VPX 光纤数据采集存储板
  20. C# 封面图片生成器

热门文章

  1. ROBOTIS-OP3机器人平台学习入门经典
  2. 白帽SEO四大提升技巧
  3. margin-left与left
  4. 猿创征文|date-fns 工作日助手函数
  5. excel制表基础:规范的制表理念和思路让效率提升 下篇
  6. 如何优化产品标题和要点
  7. Linux下的复制粘贴
  8. pidstat_Linux查看某个进程的磁盘IO读写情况 pidstat
  9. java ajax 数组_jQuery ajax - serializeArray() 方法
  10. VINS_FUSION编译运行