Python实战演练之python实现神经网络模型算法

 

 

python实现神经网络模型算法

8c107be3a5da79c3f15a4b22afc8e73a.gif

 

 

acb8949c713f12abbc5595bd5ef39b01.gif

今天,厾罗和大家分享用Python实现神经网络模型算法,仅用于技术学习交流。

 

9292b07fdf90bd2f5f88b933b7ca44f1.png

实现技巧

 

1.导入依赖库

主要是安装相关的依赖库。本文实现的环境为:python 3.7。


from __future__ import division    
import math      
import random    
import pandas as pd  

2.构建BP神经网络类

主要是构建三层反向传播神经网络类。


""" 三层反向传播神经网络 """
class NN:def __init__(self, ni, nh, no):self.ni = ni + 1                            # 输入层节点self.nh = nh + 1                    # 隐藏层节点self.no = no                      # 输出层种类self.ai = [1.0] * self.ni    self.ah = [1.0] * self.nh    self.ao = [1.0] * self.no    self.wi = self.makeMatrix(self.ni, self.nh)  # 输出层到隐藏层的映射矩阵self.wo = self.makeMatrix(self.nh, self.no)  # 隐藏层到输出层的映射矩阵for i in range(self.ni):          for j in range(self.nh):    self.wi[i][j] = self.rand(-0.2, 0.2)  for j in range(self.nh):for k in range(self.no):self.wo[j][k] = self.rand(-2, 2)  #前向传播,激活神经网络的所有节点def update(self, inputs):if len(inputs) != self.ni - 1:print(len(inputs),self.ni - 1)raise ValueError('与输入层节点数不符!')    for i in range(self.ni - 1):    self.ai[i] = inputs[i]    for j in range(self.nh):                  # self.nh表示隐藏层的节点数sum = 0.0                            # 激活项a = g(z)  z = Θ^T x ;sum相当于z,每次循环归零for i in range(self.ni):                  #通过循环z = Θ^T x ,因为Θ、x均为向量sum = sum + self.ai[i] * self.wi[i][j]  #〖 Z〗^((2))=Θ^((1)) a^((1))self.ah[j] = self.sigmoid(sum)    # a^((2))=g(z^((2))),这里使用sigmoid()函数作为激活函数for k in range(self.no):sum = 0.0for j in range(self.nh):sum = sum + self.ah[j] * self.wo[j][k]  #〖 Z〗^((3))=Θ^((2)) a^((2))self.ao[k] = self.sigmoid(sum)    # a^((3))=g(z^((3)))return self.ao[:]#反向传播,计算节点激活项的误差def backPropagate(self, targets, lr):               # targets为某样本实际种类分类,lr为梯度下降算法的学习率output_deltas = [0.0] * self.nofor k in range(self.no):error = targets[k] - np.round_(self.ao[k])output_deltas[k] = self.dsigmoid(self.ao[k]) * error# 计算隐藏层的误差hidden_deltas = [0.0] * self.nh    for j in range(self.nh):error = 0.0for k in range(self.no):error = error + output_deltas[k] * self.wo[j][k]    hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error# 更新输出层权重for j in range(self.nh):            # 反向传播算法,求出每个节点的误差后,反向更新权重for k in range(self.no):change = output_deltas[k] * self.ah[j]    self.wo[j][k] = self.wo[j][k] + lr * change   # 更新输入层权重for i in range(self.ni):                    for j in range(self.nh):change = hidden_deltas[j] * self.ai[i]self.wi[i][j] = self.wi[i][j] + lr * change# 计算误差error = 0.0for k in range(self.no):                                    error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  return error                                          #用测试集输出准确率def test(self, patterns):                            count = 0num=0for p in patterns:target = p[1]result = self.update(p[0])                    print(p[0], ':', target, '->', np.round_(result))num=0for k in range(self.no):if (target[k] == np.round_(result[k])):num +=1print(num)if num==3:count +=1print("******************",(target) == (np.round_(result)),"******************")accuracy = int(float(count / len(patterns))*100)print('accuracy: %-.9f' % accuracy,"%")      #输出训练过后神经网络的权重矩阵def weights(self):print('输入层权重:')for i in range(self.ni):print(self.wi[i])print()print('输出层权重:')for j in range(self.nh):print(self.wo[j])#用训练集训练神经网络def train(self, patterns, iterations=1000, lr=0.1):  for i in range(iterations):error = 0.0                    for p in patterns:            inputs = p[0]            targets = p[1]            self.update(inputs)          error = error + self.backPropagate(targets, lr)  if i % 100 == 0:print("percent:",int(i/iterations*100),"%",'   error: %-.9f' % error)#生成区间[a, b)内的随机数def rand(self, a, b):    return (b - a) * random.random() + a    # 生成大小 I*J 的矩阵,默认零矩阵def makeMatrix(self, I, J, fill=0.0):    m = []    for i in range(I):    m.append([fill] * J)    return m   # 函数 sigmoid,bp神经网络前向传播的激活函数def sigmoid(self, x):return 1.0 / (1.0 + math.exp(-x))       # 函数 sigmoid 的导数,反向传播时使用def dsigmoid(self, x):return x * (1 - x)

3.读取数据并进行预处理

主要是读取构建分类模型的数据,并进行预处理。

  data = []                            raw = pd.read_csv('iris.csv')    raw_data = raw.values            raw_feature = raw_data[1:, 1:5]    for i in range(len(raw_feature)):          ele = []                    ele.append(list(raw_feature[i]))  if raw_data[i][5] == 0:   ele.append([0, 0,1])    elif raw_data[i][5] == 1:ele.append([0,1, 0])elif raw_data[i][5] == 2:ele.append([1, 1,1])else:ele.append([0, 0,0])data.append(ele)

4.利用构建的BP神经网络预测类,创建神经网络模型

主要是用BP神经网络预测类创建神经网络类模型。

  nn = NN(4, 10, 3)  

5.BP分类模型训练及预测

主要是划分训练集和测试集,并进行BP分类模型训练和预测。

   training = data[1:100]            test = data[101:]            nn.train(training, iterations=1000)  nn.test(test) 

完整源代码


from __future__ import division    
import math      
import random    
import pandas as pd    
import numpy as np""" 三层反向传播神经网络 """
class NN:def __init__(self, ni, nh, no):self.ni = ni + 1                            # 输入层节点self.nh = nh + 1                    # 隐藏层节点self.no = no                      # 输出层种类self.ai = [1.0] * self.ni    self.ah = [1.0] * self.nh    self.ao = [1.0] * self.no    self.wi = self.makeMatrix(self.ni, self.nh)  # 输出层到隐藏层的映射矩阵self.wo = self.makeMatrix(self.nh, self.no)  # 隐藏层到输出层的映射矩阵for i in range(self.ni):          for j in range(self.nh):    self.wi[i][j] = self.rand(-0.2, 0.2)  for j in range(self.nh):for k in range(self.no):self.wo[j][k] = self.rand(-2, 2)  #前向传播,激活神经网络的所有节点def update(self, inputs):if len(inputs) != self.ni - 1:print(len(inputs),self.ni - 1)raise ValueError('与输入层节点数不符!')    for i in range(self.ni - 1):    self.ai[i] = inputs[i]    for j in range(self.nh):                  # self.nh表示隐藏层的节点数sum = 0.0                            # 激活项a = g(z)  z = Θ^T x ;sum相当于z,每次循环归零for i in range(self.ni):                  #通过循环z = Θ^T x ,因为Θ、x均为向量sum = sum + self.ai[i] * self.wi[i][j]  #〖 Z〗^((2))=Θ^((1)) a^((1))self.ah[j] = self.sigmoid(sum)    # a^((2))=g(z^((2))),这里使用sigmoid()函数作为激活函数for k in range(self.no):sum = 0.0for j in range(self.nh):sum = sum + self.ah[j] * self.wo[j][k]  #〖 Z〗^((3))=Θ^((2)) a^((2))self.ao[k] = self.sigmoid(sum)    # a^((3))=g(z^((3)))return self.ao[:]#反向传播,计算节点激活项的误差def backPropagate(self, targets, lr):               # targets为某样本实际种类分类,lr为梯度下降算法的学习率output_deltas = [0.0] * self.nofor k in range(self.no):error = targets[k] - np.round_(self.ao[k])output_deltas[k] = self.dsigmoid(self.ao[k]) * error# 计算隐藏层的误差hidden_deltas = [0.0] * self.nh    for j in range(self.nh):error = 0.0for k in range(self.no):error = error + output_deltas[k] * self.wo[j][k]    hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error# 更新输出层权重for j in range(self.nh):            # 反向传播算法,求出每个节点的误差后,反向更新权重for k in range(self.no):change = output_deltas[k] * self.ah[j]    self.wo[j][k] = self.wo[j][k] + lr * change   # 更新输入层权重for i in range(self.ni):                    for j in range(self.nh):change = hidden_deltas[j] * self.ai[i]self.wi[i][j] = self.wi[i][j] + lr * change# 计算误差error = 0.0for k in range(self.no):                                    error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  return error                                          #用测试集输出准确率def test(self, patterns):                            count = 0num=0for p in patterns:target = p[1]result = self.update(p[0])                    print(p[0], ':', target, '->', np.round_(result))num=0for k in range(self.no):if (target[k] == np.round_(result[k])):num +=1print(num)if num==3:count +=1print("******************",(target) == (np.round_(result)),"******************")accuracy = int(float(count / len(patterns))*100)print('accuracy: %-.9f' % accuracy,"%")      #输出训练过后神经网络的权重矩阵def weights(self):print('输入层权重:')for i in range(self.ni):print(self.wi[i])print()print('输出层权重:')for j in range(self.nh):print(self.wo[j])#用训练集训练神经网络def train(self, patterns, iterations=1000, lr=0.1):  for i in range(iterations):error = 0.0                    for p in patterns:            inputs = p[0]            targets = p[1]            self.update(inputs)          error = error + self.backPropagate(targets, lr)  if i % 100 == 0:print("percent:",int(i/iterations*100),"%",'   error: %-.9f' % error)#生成区间[a, b)内的随机数def rand(self, a, b):    return (b - a) * random.random() + a    # 生成大小 I*J 的矩阵,默认零矩阵def makeMatrix(self, I, J, fill=0.0):    m = []    for i in range(I):    m.append([fill] * J)    return m   # 函数 sigmoid,bp神经网络前向传播的激活函数def sigmoid(self, x):return 1.0 / (1.0 + math.exp(-x))       # 函数 sigmoid 的导数,反向传播时使用def dsigmoid(self, x):return x * (1 - x)if __name__ == '__main__':data = []                            raw = pd.read_csv('iris.csv')    raw_data = raw.values            raw_feature = raw_data[1:, 1:5]    for i in range(len(raw_feature)):          ele = []                    ele.append(list(raw_feature[i]))  if raw_data[i][5] == 0:   ele.append([0, 0,1])    elif raw_data[i][5] == 1:ele.append([0,1, 0])elif raw_data[i][5] == 2:ele.append([1, 1,1])else:ele.append([0, 0,0])data.append(ele)nn = NN(4, 10, 3)  training = data[1:100]            test = data[101:]            nn.train(training, iterations=1000)  nn.test(test)

 

79d7d1c71775053c3238c743bb761f6e.gif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言联合体

联合体 联合体联合体基本概念联合体特点联合体内存结构图 联合体 联合体基本概念 联合体概念: 结构体(struct)是一种结构体类型或者复杂类型,它可以包含多个类型不同的成员另外一种和结构体非常类似的类型,叫做联合…

GPT-4 变懒了?官方回复

你是否注意到,最近使用 ChatGPT 的时候,当你向它提出一些问题,却得到的回应似乎变得简短而敷衍了?对于这一现象,ChatGPT 官方给出了回应。 译文:我们听到了你们所有关于 GPT4 变得更懒的反馈!我…

在HTML中插入音频和视频(详解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在HTML中插入音频和视频以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …

外汇交易中的MT4软件优势:解析软件对交易的影响!

近年来,随着金融科技的不断发展,MT4软件作为外汇交易领域的领先平台,备受交易者青睐。本文将探讨MT4软件在外汇交易中的优势以及对交易的影响,帮助读者深入了解这一交易利器。 ### 1. MT4软件概述 MetaTrader 4(简称MT4)是一款由M…

深度学习 时间序列回归学习笔记

目录 常用的深度学习时间序列回归模型: ARIMA模型 ETS模型 效果评估

低多边形3D建模动画风格纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

【Linux】make/Makefile --- 自动化构建项目的工具

目录 一、make/Makefile的简单使用 二、Makefile 的语法规则 三、实现的原理 3.1 make/Makefile识别文件新旧 3.2 .PHONY修饰的伪目标总是被执行 3.3 make/Makefile是具有依赖性的推导能力的 四、语法技巧 五、注意事项 Linux中自动化构建项目最简单的方式:…

python乐观锁和悲观锁

在并发编程中,锁是一种常用的机制,用于保护共享资源的访问。乐观锁和悲观锁是两种不同的锁机制。 乐观锁:不会一开始就加锁,在更新的时候,判断一下在此期间别人是否修改了数据,若修改了不执行此操作&#…

软件质量:建立信心的十大指标

. Bug 数量——可能按优先级或严重性排列 一般来说,错误的数量会在项目生命周期的中期开始增加。在截止日期之前的几天或几周(取决于项目的规模),团队将集中精力减少 bug 的数量,直到 bug 的数量达到某种渐近线。这个渐…

Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。

Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…

如何把kubernetes pod中的文件拷贝到宿主机上或者把宿主机上文件拷贝到kubernetes pod中

1. 创建一个 Kubernetes Pod 首先&#xff0c;下面是一个示例Pod的定义文件&#xff08;pod.yaml&#xff09;&#xff1a; cat > nginx.yaml << EOF apiVersion: v1 kind: Pod metadata:name: my-nginx spec:containers:- name: nginximage: nginx EOF kubectl app…

LabelImg的使用及注意事项

LabelImg是一款开源的图像标注工具&#xff0c;它主要用于标注目标检测、语义分割和图像分类等深度学习中需要的数据集。通过使用LabelImg&#xff0c;用户可以快速、准确地为图片中的目标添加标注信息&#xff0c;从而建立数据集。 使用步骤&#xff1a; 下载LabelImg&#x…

java测试rtsp地址连接状态,测试RTSP连接状态是否成功,java如何测试rtsp地址连接是否成功

import java.net.Socket; import java.net.URI; import java.net.URISyntaxException;/*** ClassName: RTSPUtils* Description: 测试RTSP连接状态* Author: zhanghui* Date: 2023-12-08* Version: 1.0**/ public class RTSPUtils {private static final int TIMEOUT_MS 10000…

我的创作纪念日(2周年)

机缘 在进入大学之前&#xff0c;完全没有听说过CSDN&#xff0c;第一次使用CSDN应该是搜C语言如何学&#xff0c;或者是和C语言相关的其他内容 因为我本人是学计算机专业的&#xff0c;大一刚开学因为疫情延迟了开学时间&#xff0c;老师线上教课&#xff0c;但是我之前是完…

永磁同步电机反电动势系数怎么算?磁链强度怎么算?转矩系数怎么算?

在进行永磁同步电机simulink仿真时&#xff0c;一个关键参数就是永磁体磁链强度&#xff0c; 实际上在simulink中&#xff0c;永磁体磁链强度/反电动势系数/转矩系数这三个是放一起的&#xff0c;这是因为他们都可互相算出来。 Torque constat (Nm/A) 转矩系数 1.5 * Np *…

在浏览器中存储token的最佳实践

在浏览器中存储token的最佳实践 Web 应用程序不是静态站点&#xff0c;而是静态和动态内容的精心组合。更常见的是&#xff0c;Web 应用程序逻辑在浏览器中运行。该应用程序不是从服务器获取所有内容&#xff0c;而是在浏览器中运行 JavaScript&#xff0c;从后端 API 获取数据…

Tomcat部署开源站点JPress

前言 JPress使用Java开发&#xff0c;是我们常见的开源博客系统。JPress是一个开源的WordPress插件&#xff0c;它提供了一个简单而强大的方式来创建企业级站点。该插件包括许多特性&#xff0c;例如主题定制、页面构建器、性能优化、SEO、安全、电子商务和社交媒体整合等。使用…

Linux卸载MySql(简洁版)

安装MySql https://blog.csdn.net/tongxin_tongmeng/article/details/128263398 停止服务 service mysql stop 删除服务 chkconfig --del mysql 删除目录 rm -rf /opt/mysql 删除配置 rm -f /etc/my.cnf 删除启动脚本 rm -f /etc/init.d/mysql 删除用户和组 userdel mysql &am…

C_1练习题答案

1.在一个C程序中() A. main函数必须出现在所有函数之前 B. main函数可以出现在任何地方 C. main函数必须出现在所有函数之后 D. main 函数必须出现在固定位置 B 2.下列不合法的用户标识符是() A. j2_KEY B. Double C. 4d_a D.8 C 3,在“文件包含”预处理语句的使用过程…

thinkphp6入门(12)-- 一对一关联模型

定义一对一关联&#xff0c;例如&#xff0c;一个用户都有一个个人资料。 一、两表 1.用户表:user 2.工作经验表&#xff1a;work_experience user表的id关联work_experience表的user_id。 注意看&#xff0c;user_id1的有2条工作经验 二、数据模型 主表模型&#xff1a;…