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.0
            for 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.no
        for 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.0
            for 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.0
        for k in range(self.no):                                    
            error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  
        return error                                          
 
    #用测试集输出准确率
    def test(self, patterns):                            
        count = 0
        num=0
        for p in patterns:
            target = p[1]
            result = self.update(p[0])                    
            print(p[0], ':', target, '->', np.round_(result))
            num=0
            for k in range(self.no):
                if (target[k] == np.round_(result[k])):
                    num +=1
            print(num)
            if num==3:
                count +=1
            print("******************",(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.0
            for 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.no
        for 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.0
            for 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.0
        for k in range(self.no):                                    
            error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  
        return error                                          
 
    #用测试集输出准确率
    def test(self, patterns):                            
        count = 0
        num=0
        for p in patterns:
            target = p[1]
            result = self.update(p[0])                    
            print(p[0], ':', target, '->', np.round_(result))
            num=0
            for k in range(self.no):
                if (target[k] == np.round_(result[k])):
                    num +=1
            print(num)
            if num==3:
                count +=1
            print("******************",(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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数值计算方法(黄明游)】迭代法的一般形式与收敛性定理

一、向量、矩阵范数与谱半径 【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】 1. 向量范数 l 1 l_1 l1​ 范数(曼哈顿范数): ∣ ∣…

MybatisPlus集成baomidou-dynamic,多数据源配置使用、MybatisPlus分页分组等操作示例

文章目录 MybatisPlus特性MybatisPlus支持数据库MybatisPlus 架构多数据源应用场景pom配置示例代码 MybatisPlus特性 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD&#…

MySQL深入——8

Order by语句是如何工作的? 首先我们来创建一个表 CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 全字段…

JVS低代码表单引擎:数据校验与处理的先锋

随着信息技术的迅速发展,数据校验与处理已经成为了各类应用中不可或缺的一环。尤其是在涉及敏感信息,如密码处理时,其安全性和准确性显得尤为重要。JVS低代码表单引擎提供了强大的文本组件触发逻辑校验功能,它能够在用户填写数据的…

Python数据科学视频讲解:数据清洗、特征工程和数据可视化的注意事项

1.6 数据清洗、特征工程和数据可视化的注意事项 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.6节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程…

【calcitonin ; 降钙素 ;降钙素原】

Parathyroid_Hormone -甲状旁腺激素 PTH ; 特立帕肽;

【小米电脑管家】安装使用教程--非小米电脑

安装说明功能体验下载资源 Xiaomi HyperOS发布后,小米妙享电脑端独立版本也走向终点,最新的【小米电脑管家】将会内置妙享实现万物互联。那么本篇文章将分享非小米电脑用户如何绕过设备识别验证安装使用【小米电脑管家】实现万物互联 安装说明 1.解压文…

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

文章目录 前言什么是依赖注入C# 使用依赖注入框架介绍 Microsoft.Extensions.DependencyInjectionNuget安装简单单例使用打印结果 自动装配举例自动装配测试用例打印结果自动装配执行顺序测试用例有歧义构造函数渐进式构造函数循环依赖 自动装配结论 手动装配手动注入别名注入 …

深入解析Spring Boot中的注解@PathVariable、@RequestParam、@RequestBody的正确使用

文章目录 1. 引言2. PathVariable:处理路径变量2.1 简介2.2 使用示例 3. RequestParam:处理请求参数3.1 简介3.2 使用示例 4. RequestBody:处理请求体4.1 简介4.2 使用示例 5. 多个注解的组合使用6. 参数绑定的原理6.1 HandlerMethodArgument…

亚马逊运营推荐数仓项目实战

亚马逊运营推荐数仓项目实战 项目技术栈 HadoopSpark (Python)Scala SparkSQLSparkStreaming MongoDB Redis Kafka Flume ( SpringMVC vue) 1 项目介绍 1.1 项目系统架构 项目以推荐系统建设领域知名的经过修改过的中文亚马逊电商数据集作为依托,以某电商…

Kubersphere应用【二】Docker安装

一、Docker安装 1.下载Docker安装包 【地址】Index of linux/static/stable/x86_64/ 2.上传至服务器 # 解压文件 tar -xvf docker-20.10.10.tgz# 将docker 目录中的所有文件复制至/usr/bin/目录下 cp docker/* /usr/bin 3.配置docker.service文件 vim /usr/lib/systemd/sy…

分割算法-大津算法

分割算法-大津算法 一、什么是大津算法二、算法原理三、公式推导四、代码五、算法适用性 大津算法介绍以及C函数代码实现。 一、什么是大津算法 大津算法(Otsu)由日本学者大津展之在1979年提出,又称最大类间方差法。此法求得的阈值&#xff…

git标签的管理与思考

git 标签管理 git 如何打标签呢? 标签是什么? 标签 相当于一个 版本管理的一个贴纸,随时 可以通过标签 切换到 这个版本的状态 , 有人可能有疑问 git commit 就可以知道 代码的改动了, 为啥还需要标签来管理呢? …

C++包管理利器CPM

C包管理利器CPM 一、介绍 CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake. It’s built as a thin wrapper around CMake’s FetchContent module that adds version control, caching, a simple API and more. CPM.cma…

四:爬虫-Cookie与Session实战

四:Cookie与Session实战 ​ 在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器…

Uniapp软件库全新带勋章功能(包含前后端源码)

源码介绍: Uniapp开发的软件库全新带勋章功能,搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名,电脑需要下载:HBuilderX 登录账号 没有账号就注册账号, 然后上传文件,打包选择 “…

轻量封装WebGPU渲染系统示例<43>- 材质组装流水线(MaterialPipeline)之灯光和阴影(源码)

目标: 数据化,模块化,自动化 备注: 从这个节点开始整体设计往系统规范的方向靠拢。之前的都算作是若干准备。所以会和之前的版本实现有些差异。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sa…

spring cloud 修改bootstrap文件的文件名

前言 spring boot 2.1.2.RELEASE spring cloud 默认的启动文件 spring cloud 默认的启动文件为 bootstrap.yml 修改bootstrap文件的文件名 添加参数 --spring.config.locationclasspath:bootstrap.yml或者 --spring.cloud.bootstrap.locationclasspath:bootstrap.yml还可…

TrustZone​之在安全状态之间切换

如果处理器处于NS.EL1,而软件想要转移到S.EL1,应该如何实现呢? 要改变安全状态,无论是向上还是向下,执行都必须经过EL3,如下图所示: 前面的图表显示了在不同安全状态之间移动涉及的步骤的示例序列。逐步进行解释: 进入较高的异常级别需要一个异常。通常,此异常…

【ScienceAI Weekly】IBM新AI芯片提效25倍;清华大学发AI辅助框架;DeepMind新工具预测220万新晶体

「ScienceAI Weekly」是 HyperAI 超神经新创建的半月更栏目,主要从科研成果、企业动态、工具资源、近期活动 4 个维度,收集呈现 ScienceAI 领域近期值得关注的最新动态,以期为长期关注该领域的从业者、爱好者,提供更有价值的圈内资…