题目:BP神经网络分类器
一、实验项目: BP神经网络对鸢尾花进行分类
二、实验目的:
掌握BP神经网络学习算法,利用BP神经网络进行数据分类
三、实验内容:
1、编程实现BP神经网络算法
2、建立三层BP神经网络,节点个数、参数自拟
3、选择iris-人工神经网络.txt中的一部分数据集作为训练集,通过训练集对BP神经网络的连接权重进行学习
4、记录实验数据(连接权值的变化、迭代次数、总的误差变化)
5、用剩下的数据集作为测试集,验证学习的效果
四、实验要求:
1、画出实验所用的BP神经网络的结构图
2、附上主体代码清单
3、写清楚实验步骤和实验结果
4、调节参数后,得到不同的实验数据,对数据进行分析



代码:

import numpy as np
import pandas as pd'''构建一个具有1个隐藏层的神经网络,隐层的大小为5输入层为2个特征,输出层为2个分类0为第一类,1为第二类
'''
# 1.初始化参数
def initialize_parameters(n_x, n_h, n_y):np.random.seed(2)# 权重和偏置矩阵w1 = np.random.randn(n_h, n_x) * 0.01b1 = np.zeros(shape=(n_h, 1))w2 = np.random.randn(n_y, n_h) * 0.01b2 = np.zeros(shape=(n_y, 1))print('输入层与隐含层之间的初始权值:')print(w1)print('输入层与隐含层之间的初始偏置:')print(b1)print('隐含层与输出层之间的初始权值:')print(w2)print('隐含层与输出层之间的初始偏置:')print(b2)# 通过字典存储参数parameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 2.前向传播
def forward_propagation(X, parameters):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']# 通过前向传播来计算a2z1 = np.dot(w1, X) + b1     # 这个地方需注意矩阵加法:虽然(w1*X)和b1的维度不同,但可以相加a1 = np.tanh(z1)            # 使用tanh作为第一层的激活函数z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))  # 使用sigmoid作为第二层的激活函数# 通过字典存储参数cache = {'z1': z1, 'a1': a1, 'z2': z2, 'a2': a2}return a2, cache# 3.计算代价函数
def compute_cost(a2, Y, parameters):m = Y.shape[1]      # Y的列数即为总的样本数# 采用交叉熵(cross-entropy)作为代价函数logprobs = np.multiply(np.log(a2), Y) + np.multiply((1 - Y), np.log(1 - a2))cost = - np.sum(logprobs) / mreturn cost# 4.反向传播(计算代价函数的导数)
def backward_propagation(parameters, cache, X, Y):m = Y.shape[1]w2 = parameters['w2']a1 = cache['a1']a2 = cache['a2']# 反向传播,计算dw1、db1、dw2、db2dz2 = a2 - Ydw2 = (1 / m) * np.dot(dz2, a1.T)db2 = (1 / m) * np.sum(dz2, axis=1, keepdims=True)dz1 = np.multiply(np.dot(w2.T, dz2), 1 - np.power(a1, 2))dw1 = (1 / m) * np.dot(dz1, X.T)db1 = (1 / m) * np.sum(dz1, axis=1, keepdims=True)grads = {'dw1': dw1, 'db1': db1, 'dw2': dw2, 'db2': db2}return grads# 5.更新参数
def update_parameters(parameters, grads, learning_rate=0.4):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']dw1 = grads['dw1']db1 = grads['db1']dw2 = grads['dw2']db2 = grads['db2']# 更新参数w1 = w1 - dw1 * learning_rateb1 = b1 - db1 * learning_ratew2 = w2 - dw2 * learning_rateb2 = b2 - db2 * learning_rateparameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 6.模型评估
def predict(parameters, x_test, y_test):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']print('训练集训练后,输入层与隐含层之间的权值为:')print(w1)print('训练集训练后,输入层与隐含层之间的偏置为:')print(b1)print('训练集训练后,隐含层与输出层之间的权值为:')print(w2)print('训练集训练后,隐含层与输出层之间的偏置为:')print(b2)print('================================================================')print('================================================================')z1 = np.dot(w1, x_test) + b1a1 = np.tanh(z1)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))# 结果的维度n_rows = y_test.shape[0]n_cols = y_test.shape[1]# 预测值结果存储output = np.empty(shape=(n_rows, n_cols), dtype=int)for i in range(n_rows):for j in range(n_cols):if a2[i][j] > 0.5:output[i][j] = 1else:output[i][j] = 0print('预测结果:')print(output)print('真实结果:')print(y_test)count = 0for k in range(0, n_cols):if output[0][k] == y_test[0][k] :count = count + 1else:print(k)acc = count / int(y_test.shape[1]) * 100print('准确率:%.2f%%' % acc)# 建立神经网络
def nn_model(X, Y, n_h, n_input, n_output, num_iterations=10000, print_cost=False):np.random.seed(3)n_x = n_input           # 输入层节点数n_y = n_output          # 输出层节点数print('================================================================')print('================================================================')# 1.初始化参数parameters = initialize_parameters(n_x, n_h, n_y)print('================================================================')print('================================================================')# 2.前向传播a2, cache = forward_propagation(X, parameters)# 3.计算代价函数cost0 = compute_cost(a2, Y, parameters)# 4.反向传播grads = backward_propagation(parameters, cache, X, Y)# 5.更新参数parameters = update_parameters(parameters, grads)# 梯度下降循环for i in range(1, num_iterations+1):# 2.前向传播a2, cache = forward_propagation(X, parameters)# 3.计算代价函数cost = compute_cost(a2, Y, parameters)# 4.反向传播grads = backward_propagation(parameters, cache, X, Y)# 5.更新参数parameters = update_parameters(parameters, grads)# 每1000次迭代,输出一次代价函数
# =============================================================================
#         if print_cost and i % 1000 == 0:
#             print('迭代第%i次,代价函数为:%f' % (i, cost))
# =============================================================================print('迭代次数为:%i次,总的误差变化为:%f' % (i, cost-cost0))print('================================================================')print('================================================================')return parametersif __name__ == "__main__":# 读取数据f=open('F:\\小n\\智能计算\\实验\\实验3\\iris数据集\\iris-人工神经网络-训练集.txt')data_set = pd.read_table(f,sep=',', header=None)# 不同的取数据的方式X = data_set[data_set.columns[0:2]].values.TY = data_set[data_set.columns[2:3]].values.TY = Y.astype('uint8')# 输入2个节点,隐层5个节点,输出1个节点,迭代10000次parameters = nn_model(X, Y, n_h=5, n_input=2, n_output=1, num_iterations=10000, print_cost=True)# 对模型进行测试f1=open('F:\\小n\\智能计算\\实验\\实验3\\iris数据集\\iris-人工神经网络-测试集.txt')data_test = pd.read_csv(f1, header=None)x_test = data_test[data_test.columns[0:2]].values.Ty_test = data_test[data_test.columns[2:3]].values.Ty_test = y_test.astype('uint8')predict(parameters, x_test, y_test)

运行结果:

参考文章:
Python 基于BP神经网络的鸢尾花分类
pandas之 read_table函数读取txt文件

总结一下遇到的小问题:
(1)敲pandas出错?
(第一次用pandas库)误以为就是panda,运行的时候发现没有这个模块。
(2)利用pandas不能直接读含有中文的路径,否则会报错

 #路径中含有中文,pandas不能直接读,报错data_set = pd.read_table('F:\\小n\\智能计算\\实验\\实验3\\iris数据集\\iris-人工神经网络-训练集.txt',sep=',', header=None)#如何解决f=open('F:\\小n\\智能计算\\实验\\实验3\\iris数据集\\iris-人工神经网络-训练集.txt')data_set = pd.read_table(f,sep=',', header=None)

(3)如何用pandas来读取txt文件数据(非常方便,尤其是对txt文件中的数据切片取行或取列时),使用read_table()方法。pandas的read_table返回一个DataFrame,二维型的,会像一棋盘那样标识数据。事实上,所谓的txt文件中的数据就是一个DataFrame。如下图所示:

data_set = pd.read_table(f,sep=',', header=None)

其中,f是读入的txt文件的路径;sep=‘,’ 表示txt文件单行数据之间的分隔符为逗号,这个参数可缺省,默认为sep=‘\t’,制表符;header=None 表示txt文件的第一行不是列的名字,是数据。
(4)最简单的对DataFrame取列的方式:
(一个txt文件中的数据,就是一个DataFrame)

 X = data_set[data_set.columns[0:2]].values.T  #取第1,2列Y = data_set[data_set.columns[2:3]].values.T   #取第3列

(5)BP神经网络构建一个分类器的思路:
第一步:初始化参数(包括权值和偏置)
第二步:前向传播
第三步:计算代价函数
第四步:反向传播
第五步:更新参数
第六步:模型评估
其中:第二、三、四、五步是建立训练集的基础上进行的,得到一组训练后的权值和偏置,到目前为止就实现了一个分类器;以这一组新的权值和偏置作为测试集的初始化参数,通过前向传播的结果与真实结果的对比来估计这个分类器的好坏。

BP神经网络对鸢尾花进行分类相关推荐

  1. Python 基于BP神经网络的鸢尾花分类

    本文用Python实现了BP神经网络分类算法,根据鸢尾花的4个特征,实现3种鸢尾花的分类. 算法参考文章:纯Python实现鸢尾属植物数据集神经网络模型 2020.07.21更新: 增加了分类结果可视 ...

  2. BP神经网络之鸢尾花

    转载自:https://www.cnblogs.com/418ks/p/6053689.html BP神经网络基本原理: 误差逆传播(back propagation, BP)算法是一种计算单个权值变 ...

  3. python构建bp神经网络_鸢尾花分类(一个隐藏层)__1.数据集

    IDE:jupyter 目前我知道的数据集来源有两个,一个是csv数据集文件另一个是从sklearn.datasets导入 1.1 csv格式的数据集(下载地址已上传到博客园----数据集.rar) ...

  4. 【图像处理】——Python实现图像特征提取BP神经网络实现图像二分类

    目录 一.图像特征提取 二.BP实现图像二分类 1.输入层.隐层.输出层结点个数设置 (1)one hot码(假设是n分类问题) (2)一个输出,输出层结点为1 一.图像特征提取 图像具有灰度特征.G ...

  5. 利用神经网络对鸢尾花数据集分类

    利用神经网络对鸢尾花数据集分类 详细实现代码请见:https://download.csdn.net/download/weixin_43521269/12578696 一.简介 一个人工神经元网络是 ...

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

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

  7. 基于matlab国内外水果自动分级方面,水果自动识别的BP神经网络方法

    摘  要:针对多种水果混合的图像,对各种水果的提取和识别进行研究.利用Matlab软件进行图像数据获取.对比度增强.去噪.二值化处理:为弥补二值化后图像中出现的断边.孔洞,借助Sobel算子进行边缘提 ...

  8. MATLAB水果自动识别的BP神经网络方法

    水果自动识别的BP神经网络方法 摘 要:针对多种水果混合的图像,对各种水果的提取和识别进行研究.利用Matlab软件进行图 像数据获取.对比度增强.去噪.二值化处理:为弥补二值化后图像中出现的断边.孔 ...

  9. matlab水果定位与分割,利用Matlab软件和BP神经网络快速识别水果实现分拣

    我国是水果生产与消费大国,我国水果不但品种丰富,而且以水果为原料的食品如罐头.果冻等加工产业也颇具规模.然而,在水果果料的加工过程中可能会不经意地混入诸如毛发.纤维丝.纸屑.金属.油漆等异物,从而对产 ...

最新文章

  1. 谷歌扔下芯片核弹:开源全球首个可制造的PDK,免费帮有缘人实现造芯梦想
  2. 闽台“物联网+”产业融合方兴未艾
  3. Android 优秀UI控件 ---- FlowingDrawer
  4. android 收起下拉菜单,Android 展开/折叠 系统下拉通知栏
  5. qsort()编译器自带快速排序的用法
  6. 看看 JDK 8 给我们带来什么
  7. 机器学习java_Java机器学习,第1部分
  8. python twisted教程一,异步编程
  9. ★LeetCode(1025)——除数博弈(JavaScript)
  10. 【渝粤教育】国家开放大学2019年春季 1013金融统计分析 参考试题
  11. 微軟將在廉價筆記本電腦上測試Windows
  12. ZooKeeper搭建实验
  13. 单片机(ISIS 7 Professional):交通灯代码项目
  14. linux live运行 光盘弹出复,通过liveCD进行ubuntu启动修复
  15. 查看变量数据类型的python内置函数_查看变量类型的Python内置函数是
  16. ApacheCon Asia 2022 开启报名:Pulsar 技术议题重磅亮相
  17. 怎么删除桌面上的图标
  18. Matlab矩阵和数组的操作
  19. 23.MongoDB地理位置检索
  20. 李学江:B2B行业门户网站最终页标题设置方法

热门文章

  1. U盘常见病毒或木马解决篇
  2. Resultful API
  3. 小虎电商浏览器:拼多多怎么看单品实时数据
  4. Ubuntu 配置亚马逊 aws cli 上传文件文件夹至 亚马逊 AWS S3
  5. wps英文参考文献怎么对齐_wps英文参考文献怎么对齐_【论文攻略】排版技巧——如何用 Word 编辑参考文献......
  6. java 倍数_Java硬币翻转倍数递增试算实例
  7. 用html和js制作一个控制灯泡开关效果
  8. 根据经纬度查询地名,
  9. iphone各机型的分辨率及像素
  10. 常用图片格式JPG\PNG\SVG该如何选择?