掌握误差逆传播算法(BP算法)的工作流程

编码实现标准BP算法和累积BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
seed = 2020
import random
np.random.seed(seed)  # Numpy module.
random.seed(seed)  # Python random module.
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.close('all')#数据预处理
def preprocess(data):#将非数映射数字for title in data.columns:if data[title].dtype=='object':encoder = LabelEncoder()data[title] = encoder.fit_transform(data[title])         #去均值和方差归一化ss = StandardScaler()X = data.drop('好瓜',axis=1)Y = data['好瓜']X = ss.fit_transform(X)x,y = np.array(X),np.array(Y).reshape(Y.shape[0],1)return x,y
#定义Sigmoid
def sigmoid(x):return 1/(1+np.exp(-x))
#求导
def d_sigmoid(x):return x*(1-x)#累积BP算法def accumulate_BP(x,y,dim=10,eta=0.8,max_iter=500):n_samples = x.shape[0]w1 = np.zeros((x.shape[1],dim))b1 = np.zeros((n_samples,dim))w2 = np.zeros((dim,1))b2 = np.zeros((n_samples,1))losslist = []for ite in range(max_iter):##前向传播   u1 = np.dot(x,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2)loss = np.mean(np.square(y - out2))/2losslist.append(loss)print('iter:%d  loss:%.4f'%(ite,loss))##更新d_out2 = -(y - out2)d_u2 = d_out2*d_sigmoid(out2)d_w2 = np.dot(np.transpose(out1),d_u2)d_b2 = d_u2d_out1 = np.dot(d_u2,np.transpose(w2))d_u1 = d_out1*d_sigmoid(out1)d_w1 = np.dot(np.transpose(x),d_u1)d_b1 = d_u1w1 = w1 - eta*d_w1w2 = w2 - eta*d_w2b1 = b1 - eta*d_b1b2 = b2 - eta*d_b2##补充Loss可视化代码plt.figure()plt.plot([i+1 for i in range(max_iter)],losslist)plt.legend(['accumlated BP'])plt.xlabel('iteration')plt.ylabel('loss')plt.show()return w1,w2,b1,b2#标准BP算法
def standard_BP(x,y,dim=10,eta=0.8,max_iter=500): n_samples = 1w1 = np.zeros((x.shape[1],dim))b1 = np.zeros((n_samples,dim))w2 = np.zeros((dim,1))b2 = np.zeros((n_samples,1))losslist = []
#补充标准BP算法代码for ite in range(max_iter):loss_per_ite = []for m in range(x.shape[0]):xi,yi = x[m,:],y[m,:]xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])#前向传播  u1 = np.dot(xi,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2)loss = np.square(yi - out2)/2loss_per_ite.append(loss)print('iter:%d  loss:%.4f'%(ite,loss))#反向传播                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             d_out2 = -(yi - out2)d_u2 = d_out2*d_sigmoid(out2)d_w2 = np.dot(np.transpose(out1),d_u2)d_b2 = d_u2d_out1 = np.dot(d_u2,np.transpose(w2))d_u1 = d_out1*d_sigmoid(out1)d_w1 = np.dot(np.transpose(xi),d_u1)d_b1 = d_u1w1 = w1 - eta*d_w1w2 = w2 - eta*d_w2b1 = b1 - eta*d_b1b2 = b2 - eta*d_b2 losslist.append(np.mean(loss_per_ite))#补充Loss可视化代码plt.figure()plt.plot([i+1 for i in range(max_iter)],losslist)plt.legend(['standard BP'])plt.xlabel('iteration')plt.ylabel('loss')plt.show()return w1,w2,b1,b2#测试def main():data = pd.read_table('C:/Users/Desktop/watermelon30.txt',delimiter=',')#换成自己的数据集data.drop('编号',axis=1,inplace=True)x,y = preprocess(data)dim = 10w1,w2,b1,b2 = standard_BP(x,y,dim)# w1,w2,b1,b2 = accumulate_BP(x,y,dim)u1 = np.dot(x,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2) y_pred = np.round(out2)result = pd.DataFrame(np.hstack((y,y_pred)),columns=['真值','预测'] )     result.to_excel('result_numpy.xlsx',index=False)#补充测试代码,根据当前的x,预测其类别;
if __name__=='__main__':main()

导出的预测表


数据记录:

本人用的西瓜数据集

编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,是
2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,是
3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,是
4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,是
5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,是
6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,是
7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,是
8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,是
9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,否
10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,否
11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,否
12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,否
13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,否
14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,否
15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,否
16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,否
17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,否

编程实现误差逆传播算法(BP算法)相关推荐

  1. 《机器学习与数据挖掘》实验五 编程实现误差逆传播算法(BP算法)

    前言: 摘要:本文对机器学习实验五 标准BP算法的代码进行实现,如果不了解的BP算法的话,可以自行上网搜索BP算法的详解. 实验题目:编程实现误差逆传播算法(BP算法) 实验目的:掌握误差逆传播算法( ...

  2. BP算法误差逆传播参数更新公式推导

    BP算法误差逆传播参数更新公式推导

  3. BP(BackPropagation)误差逆传播算法

    上篇文章介绍了多层前馈神经网络,那么这种网络是怎样训练生成的呢,BP算法就是其中一种生成多层神经网络的算法 ,又称为反向传播算法,下面来了解一下BP算法. 举例: 下图中是根据一个手写数字辨识的神经网 ...

  4. 人工智能知识全面讲解:多层神经网络与误差逆传播算法

    7.3.1 从单层到多层神经网络 明斯基教授曾表示,单层神经网络无法解决异或问题,但是当增加一个计 算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分 类效果.只是两层神经网络的计算 ...

  5. 神经网络中的常用算法-BP算法

    目录 一.概述 二.前向传播算法 三.链式法则 四.BP算法 1.损失函数 2.输出层的梯度 3.隐藏层梯度 五.BP算法流程 1.输入参数 2.算法流程 一.概述         反向传播(back ...

  6. 人工神经网络算法-BP算法原理

    人工神经网络是由大量的神经元按照大规模并行的方式通过一定的拓扑结构连接而成的.按照一定的规则将神经元连接成神经网络,并使网络中各神经元的连接权按一定的规则变化,这样一来也就产生了各式各样的神经网络模型 ...

  7. 误差逆传播算法公式理解及推导

    前言:公式理解及推导参考自<机器学习>周志华 P101 BP网络 BP网络一般是指由 误差逆传播(error BackPropagation, BP)算法训练的多层前馈神经网络. 给定训练 ...

  8. 深度学习(一)——MP神经元模型, BP算法, 神经元激活函数, Dropout

    https://antkillerfarm.github.io/ 前言 神经网络本质上不是什么新东西.十年前,我还在上学的时候,就接触过皮毛.然而那时这玩意更多的还是学术界的屠龙之术,工业界几乎没有涉 ...

  9. 机器学习与数据挖掘--编程实现BP算法

    机器学习与数据挖掘实验五 (编程实现误差逆传播算法BP算法) 实验目的: 掌握误差逆传播算法(BP算法)的工作流程 实验环境: Anaconda/Jupyter notebook/Pycharm 实验 ...

  10. 深度学习 --- BP算法详解(误差反向传播算法)

    本节开始深度学习的第一个算法BP算法,本打算第一个算法为单层感知器,但是感觉太简单了,不懂得找本书看看就会了,这里简要的介绍一下单层感知器: 图中可以看到,单层感知器很简单,其实本质上他就是线性分类器 ...

最新文章

  1. 冬季巧食生姜可提高免疫力
  2. 从“嵌入式”到“物联网”有哪些变化?
  3. ip_conntrack: table full, dropping packet的问题
  4. layDate1.0正式公布,您一直在寻找的的js日期控件
  5. RHEL 8 - 配置基于安装 ISO 文件的 YUM Repo
  6. python支持哪些平台开发_【后端开发】python能兼容哪些平台
  7. HTTP:一次完整的HTTP服务过程
  8. java+widthstep,i*step+j*channels+k 以及widthStep大小计算及原理
  9. Origin 2022b | 更新及安装 | 中英文切换
  10. 三菱plcfx5u指令手册_三菱PLC应用指令三菱FX5U-64MR/ES比较指令怎么写
  11. 贴片LED发光二极管的组成成分和正负极方向判断 LED灯伏安曲线怎么看(电流电压关系)
  12. 新浪云python示例_新浪云的基本配置
  13. BOOST元状态机用户手册之三教程(Meta State Machine (MSM))(1)——基本前端及例程
  14. 猜数字小游戏,超级简单就可以实现哦
  15. Canvas 渲染优化策略
  16. 从入门到入土:IP源地址欺骗dos攻击实验
  17. 艾媒咨询:2015年度中国智能路由器市场监测报告
  18. APS(高级计划与排程)基本概念
  19. HTML Tab 选项卡
  20. 实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie

热门文章

  1. #9733;色盲悖论正解!
  2. (CCNET)criss-cross attention network学习笔记
  3. 阿里研发三面,面试官一套组合拳让我当场懵逼
  4. mysql跨库复制_mysql跨库表结构和数据复制
  5. hdu 2079 - 选课时间
  6. keil函数和变量无法跳转到定义处的原因有哪些
  7. 巧用GoldWave预设,设置音频效果模板!
  8. 虾皮男装类目市场如何?哪些产品好卖?
  9. [原创] vlc视频播放插件使用总结
  10. 最短路径——DFS、Dijkstra、Floyd、Bellman-Ford、spfa