python,现在临近毕业也逐渐意识到这门语言的重要性,后悔不能当初把它学好(悔不当初)!!!
本文原来是matlab的,编写过常用的机器学习代码,现在转型python,希望大家看了我写的新手代码,不要嘲笑!!
学了一段时间python,自己尝试编写的第一个算法——BP神经网络,并将应用到鸢尾花数据集上,数据集连接如下:
鸢尾花数据集iris0.txt

数据集集已经进行了处理,属于纯纯的0-1问题分类(二分类问题),

先说一说在编写过程中遇到的问题,程序已经附在最后了

1、程序的模块化

在写程序的程序的时候,应当尽可能的将程序进行模块分割,一方面看起来简洁,另一方面,也会提高程序的可阅读。通常情况下,将固定功能的程序和高频重复调用次数,进行封装成单个函数。个人感觉程序模块分割可能需要考虑如下几点:
1、模块的功能是否固定,
2、封装的函数的通用性,不可能每个程序都需要重新修改封装好的函数
3、调用的次数,个人感觉对于大型程序的话,这一点比较重要

2、函数包的导入,如numpy random

对于初次接触python的来说,函数包真的是很头疼的问题,很多包都不知道什么意思,也不知道自己需要的在那个包中,
我常用的方式:
1、将光标放在报错的位置

2、同时按下快捷键:alt+enter,系统会进行提示,点击第一个选项,系统会自动导入工具包

导入前:

操作后:

3、文件的打开方式和读取方式

1、打开方式
file=open(‘filename.txt’,‘type’)

filename:代表文件的名字,注意需要加上文件的类型,如.txt,.dat 等等
type:代表的是对文件进行的操作,如 r:只读,w:只写,r+:可读可写等等,目前,我还用不到o(╥﹏╥)o

2、读取方式
file.read():默认读取文件中的每一行元素,并单独输出,这有点像readlines

file.readline():表示,支队数据的第一行读取,并将第一行中的每个元素单独进行保存,空格也不放过。

file.readlines():表示对数据进行按行读取,并将每一行进行保存成列表

4 错误:TypeError: slice indices must be integers or None or have an index method

这边表示列表在切片时的索引必须是整数才行,如,在训练集和测试集的分配过程,矩阵的数据获取,进行经常性忽略列表中数据的类型。

#按比例划分训练集和测试集trainset = dataset_temp[: int(len(dataset_temp)*ratio)]testset = dataset_temp[int(len(dataset_temp)*ratio) + 1:]

5 随机数的参数方式

随机数在网络参数初始化过程中,会经常使用,需要注意的是,需要导入random和numpy包

import random
import numpy as np

如下:
np.random.uniform(lower, upper, (size)):产生随机数,类型为浮点型,可指定上下界,指定产生随机数的大小

    input_hidden_weight = np.random.uniform(lower, upper, [num_input, num_hidden])hidden_bais = np.random.uniform(lower, upper, [1, num_hidden])hidden_output_weight = np.random.uniform(lower, upper, [num_output, num_hidden])output_bais = np.random.uniform(lower, upper, [1, num_output])

np.random.randint(lower, upper, (size)):产生指定范围的整数

5 np.mat 函数

该函数的功能主要是将列表,转化成矩阵,方便后面的计算

6 列表之间的乘运算

np.dot(sample1, sample2):将两个列表或者矩阵相乘,并将计算后的结果求和。该方法遵循矩阵之间运算法则

hidden_input = np.dot(input_data, input_hidden_weight).astype(np.float)

np.multiply(sample1, sample2):两个向量或者矩阵之间,进行点对点的相乘,返回相同大小的矩阵或者列表。

temp3 = np.multiply(error, device_sigmoid).astype(np.float)

7 错误:TypeError: Cannot cast array data from dtype(‘float64’) to dtype(’<U32’) according to the rule ‘safe’

主要是说的计算类型或者赋值类型错误,此时需要进行数据类型转化
也就是再出现错误的位置后面添加:.astype(np.float),根据自己的需要,改变数据类型

为方便阅读和验证,手写推导图敬上:

python之BP神经网络代码

'''
BP 神经网络分为如下几个部分:
1 数据读取预处理部分
2 网络参数预处理部分
3 激活函数部分
4 参数训练部分
5 模型性能测试部分
6 主函数部分'''import random
import numpy as np# 1 数据读取预处理部分
def dataset_open(address, ratio):#读取样本数据dataset = open(address)# dataset = random.shuffle#建立空的列表用于存放,训练集特征和标签,测试集特征和标签train_feature = []train_label = []test_feature = []test_label = []dataset_temp = []#将数据集进行随机打乱for i in dataset.readlines():temp1 = i.strip().split()dataset_temp.append([temp1[j] for j in range(len(temp1))])random.shuffle(dataset_temp)#按比例划分训练集和测试集trainset = dataset_temp[: int(len(dataset_temp)*ratio)]testset = dataset_temp[int(len(dataset_temp)*ratio) + 1:]#将训练集和测试集存放到相应的列表中for i in trainset:train_feature.append([i[j] for j in range(len(i) - 1)])train_label.append(i[-1])for i in testset:test_feature.append([i[j] for j in range(len(i) - 1)])test_label.append(i[-1])# data_feature.append([temp[j] for j in range(len(temp)-1)]) #同上return train_feature, train_label, test_feature, test_label# 2 网络参数预处理部分
def parameter_proprocess(num_input, num_hidden, num_output, lower, upper):#初始化产生相应大小的权重和偏置input_hidden_weight = np.random.uniform(lower, upper, [num_input, num_hidden])hidden_bais = np.random.uniform(lower, upper, [1, num_hidden])hidden_output_weight = np.random.uniform(lower, upper, [num_output, num_hidden])output_bais = np.random.uniform(lower, upper, [1, num_output])return input_hidden_weight, hidden_bais, hidden_output_weight, output_bais# 3 激活函数部分
def sigmoid(input):result = 1 / (1 + np.exp(input))return result# 4 参数训练部分
def training(train_set, train_label, input_hidden_weight, hidden_bais, hidden_output_weight, output_bais, num_iter, step_size):for k in range(num_iter):for i in range(len(train_set)):#将输入的数据从训练集中单独提取出来input_data = np.mat(train_set[i]).astype(np.float)#计算相应的隐层输入,隐层输出,输出层输入,输出层输出hidden_input = np.dot(input_data, input_hidden_weight).astype(np.float)hidden_output = sigmoid(hidden_input + hidden_bais).astype(np.float)output_input = np.dot(hidden_output, np.transpose(hidden_output_weight)).astype(np.float)output = sigmoid(output_input + output_bais).astype(np.float)#参数更新device_sigmoid = np.dot(output, 1-output).astype(np.float)error = float(output) - float(train_label[i])temp3 = np.multiply(error, device_sigmoid).astype(np.float)#输出层权重delta_beta = np.multiply(temp3, hidden_output).astype(np.float)#输出层阈值delta_b2 = temp3#隐层阈值temp4 = np.multiply(hidden_output, np.array(1-hidden_output)).astype(np.float)temp5 = np.multiply(temp4, hidden_output_weight).astype(np.float)delta_b1 = np.multiply(temp5, temp3).astype(np.float)# 隐层权重delta_w = np.multiply(np.transpose(input_data), delta_b1).astype(np.float)#加入步长,更新策略input_hidden_weight += delta_w * float(step_size)hidden_bais += delta_b1 * float(step_size)hidden_output_weight += delta_beta * float(step_size)output_bais += delta_b2 * float(step_size)return input_hidden_weight, hidden_bais, hidden_output_weight, output_bais#测试集编程
def testing(test_set, test_label, input_hidden_weight, hidden_bais, hidden_output_weight, output_bais):count = 0for i in range(len(test_set)):#测试集数据输入input_data = np.mat(test_set[i]).astype(np.float)#模型在测试集上的计算结果hidden_input = np.dot(input_data, input_hidden_weight).astype(np.float)hidden_output = sigmoid(hidden_input + hidden_bais).astype(np.float)output_input = np.dot(hidden_output, np.transpose(hidden_output_weight)).astype(np.float)output = sigmoid(output_input + output_bais).astype(np.float)# 二分类问题,取0.5作为类别分界线,考虑到不平衡问题的同学,可自行设计if output > 0.5:output = 1else:output = 0#统计预测正确的数量if output == int(test_label[i]):count += 1#计算预测正确的比例accuracy = count / len(test_set)return accuracy#模型超参数设置
num_input=4
num_hidden=100
num_output=1
lower=-1
upper=1
num_iter=100
step_size = 0.01
ratio = 0.8
#函数的调用
train_feature, train_label, test_feature, test_label = dataset_open('iris0.txt', ratio)
input_hidden_weight, hidden_bais, hidden_output_weight, output_bais = parameter_proprocess(num_input, num_hidden, num_output, lower, upper)training(train_feature, train_label, input_hidden_weight, hidden_bais, hidden_output_weight, output_bais, num_iter, step_size)
accuracy = testing(test_feature, test_label, input_hidden_weight, hidden_bais, hidden_output_weight, output_bais)print(accuracy)

新手python之BP神经网络——手写公式推导+可运行代码+编程中遇到的问题相关推荐

  1. Python纯手动搭建BP神经网络--手写数字识别

    1 实验介绍 实验要求: 实现一个手写数字识别程序, 如下图所示, 要求神经网络包含一个隐层, 隐层的神经元个数为 15. 整体思路:主要参考西瓜书第五章神经网络部分的介绍,使用批量梯度下降对神经网络 ...

  2. 基于BP神经网络手写数字和字母识别

    一:系统介绍 这个程序是在MATLAB中编写,基于BP神经网络的文字符号识别系统的具体实现,该系统既可以实现单一手写字符,也可以实现一连串的字符,而且具有较高的准确率.本系统主要有几个模块,图片输入, ...

  3. Python(TensorFlow框架)实现手写数字识别系统

    手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...

  4. Python TensorFlow框架 实现手写数字识别系统

    手写数字识别算法的设计与实现 本文使用python基于TensorFlow设计手写数字识别算法,并编程实现GUI界面,构建手写数字识别系统.这是本人的本科毕业论文课题,当然,这个也是机器学习的基本问题 ...

  5. tensorflow应用:双向LSTM神经网络手写数字识别

    tensorflow应用:双向LSTM神经网络手写数字识别 思路 Python程序1.建模训练保存 Tensorboard检查计算图及训练结果 打开训练好的模型进行预测 思路 将28X28的图片看成2 ...

  6. 四、用简单神经网络识别手写数字(内含代码详解及订正)

    本博客主要内容为图书<神经网络与深度学习>和National Taiwan University (NTU)林轩田老师的<Machine Learning>的学习笔记,因此在全 ...

  7. Python实现bp神经网络识别MNIST数据集

    title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...

  8. BP神经网络理解及公式推导

    BP神经网络理解及公式推导 __508任务 仅个人学习记录使用,可能有误 一.人工神经网络 人工神经网络(ANN)是一种旨在模仿人脑结构及其功能的由多个非常简单的处理单元彼此按某种方式相互连接而形成的 ...

  9. 神经网络——Python实现BP神经网络算法(理论+例子+程序)

    一.基于BP算法的多层感知器模型 采用BP算法的多层感知器是至今为止应用最广泛的神经网络,在多层感知器的应用中,以图3-15所示的单隐层网络的应用最为普遍.一般习惯将单隐层前馈网称为三层感知器,所谓三 ...

  10. 前馈神经网络手写数字识别

    前馈神经网络手写数字识别 今天就来说说手写数字识别,我们上课的时候老师要求我们使用前馈神经网络和卷积神经网络两种神经网络实现手写数字识别.做一下这两个实验还真的挺有意思啊. 举个例子,识别图片中的 : ...

最新文章

  1. java nio connect_Java NIO系列教程(八) SocketChannel
  2. mysql校对集_mysql之字符集与校对集
  3. wxWidgets:字体编码
  4. 2019年查询12年前的往届高考成绩(适用浙江省)
  5. linux-在cenos上安装大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)
  6. 【后端开发】分析抖音后台架构
  7. 查看计算机80端口,电脑win10 80端口被占用的检测和解决方法
  8. LeetCode 113. Path Sum II
  9. 电脑双系统--我想体验不一样的感觉
  10. MediaPipe - BlazeFace原理
  11. DNF自动获取C语言,VC++开发硬件DNF搬砖项目全新发车,想上车的要赶紧
  12. 软件工程:数据流图和结构图怎么画?
  13. python元组定义_python定义元组
  14. 解决R中installs显示Warning: unable to access index for
  15. 啦啦啦啦啦啦啦啦啦啦啦啦这是一篇分界线
  16. Android手机应用CTA认证自测
  17. 挂耳式骨传导蓝牙耳机,2021骨传导耳机推荐
  18. 保送清华计算机,高二学霸保送清华,怎么做到的?
  19. C语言之指针总结(1)
  20. springboot框架开发医院云HIS 住院医生站、住院护士站功能实现

热门文章

  1. Learn Go with tests 学习笔记(9)——Mocking
  2. Java学习——生产者-消费者模式与线程通信问题(管程法、信号灯法)
  3. 什么是java mvc模式_什么是MVC?
  4. AFML读书笔记--Sample weight
  5. 搭建IP代理池伪装IP地址
  6. 斐讯n1刷armbian建lnmp环境+WordPress
  7. 韩顺平老师B站MySQL
  8. 如何获取到微信公众号的网址
  9. OpenStack入门到实战视频教程全集下载(罗勇老师经典教程系列)
  10. Cesium原理篇:5最长的一帧之影像