数据集使用iris数据集

# 开发时间:2021/11/5 15:07
import numpy as np
import math
import random
import string
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas
from pandas import read_csv
from sklearn.preprocessing import LabelEncoder             # 编码
from sklearn.model_selection import train_test_split# 导入数据
iris = pandas.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
iris.columns=['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species']size_mapping = {'Iris-virginica': 2,            # 001'Iris-versicolor': 1,           # 010'Iris-setosa': 0}               # 100
iris['Species'] = iris['Species'].map(size_mapping)
arrary = iris.valuesa = arrary[:100, :]
b = arrary[100:, :]
c = arrary[:100, 4]# 独热编码
def onehot(targets, num_out):onehot = np.zeros((num_out, targets.shape[0]))for idx, val in enumerate(targets.astype(int)):onehot[val, idx] = 1.return onehot.T# 生成一个矩阵,大小为m*n,并且设置默认零矩阵
def makematrix(m, n, fill=0.0):a = []for i in range(m):a.append([fill] * n)return a# 函数sigmoid(),采用tanh,
def sigmoid(x):return math.tanh(x)# 函数sigmoid的派生函数
def derived_sigmoid(x):return 1.0 - x ** 2class BPNN:def __init__(self, num_in, num_hidden, num_out):self.num_in = num_in+1self.num_hidden = num_hidden+1self.num_out = num_outself.active_in = [1.0] * self.num_inself.active_hidden = [1.0] * self.num_hiddenself.active_out = [1.0] * self.num_outself.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] = np.random.normal(0.0, pow(self.num_hidden,-0.5))  # 5x4 输出num_in行,num_hidden列权重矩阵,随机生成满足正态分布的权重for i in range(self.num_hidden):for j in range(self.num_out):self.wight_out[i][j] = np.random.normal(0.0, pow(self.num_out, -0.5))# 最后建立动量因子(矩阵)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[j] * 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 j 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(self.num_out):error = error + 0.5 * (targets[i] - self.active_out[i]) ** 2return errordef train(self, a, itera=1000, lr=0.1, m=0.1):for i in range(itera):error = 0.0for j in range(100):inputs = a[j, 0:4]d = onehot(c, self.num_out)targets = d[j, :]self.update(inputs)error = error + self.errorbackpropagate(targets, lr, m)if i % 100 == 0:print('误差 %-.5f' % error)def test(self, b):for i in range(b.shape[0]):print(b[i, 0:4], '->', self.update(b[i, 0:4]))# 权重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 Mytrain():a = iris.values# 创建神经网络,4个输入节点,X个隐藏层节点,1个输出层节点n = BPNN(4, 8, 3)# 训练神经网络n.train(a)n.weights()n.test(b)if __name__ == '__main__':Mytrain()

三层BP神经网络Python代码实现相关推荐

  1. BP神经网络python代码详细解答(来自原文翻译)

    翻译如下 ** <font color=black size=6.5> 在 SCRATCH采用python 上实现一种神经网络 **         注: Scratch是一款由麻省理工学 ...

  2. BP神经网络python代码实现#超详细-小白快速入门

    注释为当前行的注释或者是下一行的注释. import numpy as np#科学计算的基础包# 定义sigmoid函数及其求导,deriv=False时进行前向传播的运算,deriv=True进行反 ...

  3. Python实现三层BP神经网络

    题外话 看论文,仿真实现,最基本的能力!研一的时候定要多看看论文,提升自己的代码能力! 引言 本篇博客默认读者有一定的BP神经网络的基础,BP神经网络的基本知识就不阐述了! BP神经网络结构 本文内容 ...

  4. 机器学习系列2 BP神经网络+代码实现

    神经网络简单的说,就是用一种层次化的方式将一堆简单的函数在顶层堆叠在一起,形成一个复杂的非线性函数,以此表达输入与输出之间的关系. 本文结构: 1.介绍构成神经网络的基本单元:神经元 2.介绍三层神经 ...

  5. 三层BP神经网络公式推导及C语言实现

    公式推导   三层BP神经网络如上图所示.其中, x i x_i xi​表示第 i i i个输入层节点的输入值,也是其输出值, z j z_j zj​表示第 j j j个隐藏层节点的输出值, y k ...

  6. 基于三层BP神经网络的人脸识别

    实验四.基于三层BP神经网络的人脸识别 一. 实验要求 采用三层前馈BP神经网络实现标准人脸YALE数据库的识别,编程语言为C系列语言. 二.BP神经网络的结构和学习算法 实验中建议采用如下最简单的三 ...

  7. gwo算法matlab源代码,智能优化算法应用:基于GWO优化BP神经网络 - 附代码

    智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 文章目录智能优化算法应用:基于GWO优 ...

  8. 模式识别八--三层BP神经网络的设计与实现

    文章转自:http://www.kancloud.cn/digest/prandmethod/102850 本文的目的是学习和掌握BP神经网络的原理及其学习算法.在MATLAB平台上编程构造一个3-3 ...

  9. 模式识别:三层BP神经网络的设计与实现

    本文的目的是学习和掌握BP神经网络的原理及其学习算法.在MATLAB平台上编程构造一个3-3-1型的singmoid人工神经网络,并使用随机反向传播算法和成批反向传播算法来训练这个网络,这里设置不同的 ...

  10. BP神经网络python实现

    BP神经网络python实现 总体布局 函数 构建网络 前馈的一个过程 更新 w , b w,b w,b 进行测试 数据读取 m a i n main main函数 数据集 总体布局 函数 S i g ...

最新文章

  1. 3层-CNN卷积神经网络预测MNIST数字
  2. 阿里云文件存储和自我管理的云解决方案的TCO比较
  3. 【IT基础】常见的开发文档
  4. 中国汽车融资租赁业运营前景与投资战略规划报告2022-2028年版
  5. 轻量级日志采集系统Loki+grafana搭建
  6. FPGrowth算法总结复习
  7. java获取服务器信息返回前端,java程序获取linux服务器进程信息
  8. Abp v2.8.0发布 路线图
  9. 《App后台开发运维与架构实践》第3章 App后台核心技术
  10. urllib2的用法
  11. android 55
  12. 47.使用外部 JavaScript 和 CSS(8)
  13. 拓端tecdat|如何在R语言中建立六边形矩阵热图heatmap可视化
  14. 金山安全报告:十大病毒危害排行出炉
  15. MAXHUB会议平板的无线投屏怎么用?
  16. GoAhead2.5源代码分析之19-web层(webs.c)
  17. web前端知识体系之基础知识 - CSS语言和功能
  18. 保龄球计分程序java_保龄球计分程序
  19. mac数字键盘错乱_苹果电脑键盘打不出数字解决办法
  20. 【雕爷学编程】Arduino动手做(2)---光敏电阻模块

热门文章

  1. VC2012 正则替换
  2. 数控车计算机软件编程的重要性,数控车床有多少人软件编程?
  3. xmind 拖拽_思维导图,原来Xmind这么强大!
  4. (附源码)计算机毕业设计java宠物领养饲养交流管理平台
  5. 禁忌搜索算法TS求解连续函数最值
  6. IDEA中使用SVN IDEA配置SVN步骤
  7. 网页测速 php,2020年8月更新 站长必备/测速工具网站推荐
  8. k-means 文本聚类 java_K-means文本聚类系列(已经完成)
  9. 毕业论文详细--校园网组建
  10. 如何利用insightface同时计算多个人脸相似度