阿里云开发者社区

电脑版
提示:原网页已由神马搜索转码, 内容由developer.aliyun.com提供.

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

2024-01-09110
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介:Python实战演练之python实现神经网络模型算法

python实现神经网络模型算法

 

 

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

 

实现技巧

 

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)

 

相关文章
|
2月前
|
负载均衡算法关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
域名解析网络协议安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
4111313
|
2月前
|
网络协议中间件网络安全
计算机网络OSI七层模型
OSI模型分为七层,各层功能明确:物理层传输比特流,数据链路层负责帧传输,网络层处理数据包路由,传输层确保端到端可靠传输,会话层管理会话,表示层负责数据格式转换与加密,应用层提供网络服务。数据在传输中经过封装与解封装过程。OSI模型优点包括标准化、模块化和互操作性,但也存在复杂性高、效率较低及实用性不足的问题,在实际中TCP/IP模型更常用。
2681010
|
2月前
|
存储监控算法
企业数据泄露风险防控视域下 Python 布隆过滤器算法的应用研究 —— 怎样防止员工私下接单,监控为例
本文探讨了布隆过滤器在企业员工行为监控中的应用。布隆过滤器是一种高效概率数据结构,具有空间复杂度低、查询速度快的特点,适用于大规模数据过滤场景。文章分析了其在网络访问监控和通讯内容筛查中的实践价值,并通过Python实现示例展示其技术优势。同时,文中指出布隆过滤器存在误判风险,需在准确性和资源消耗间权衡。最后强调构建多维度监控体系的重要性,结合技术与管理手段保障企业运营安全。
661010
|
2月前
|
机器学习/深度学习搜索推荐PyTorch
基于昇腾用PyTorch实现CTR模型DIN(Deep interest Netwok)网络
本文详细讲解了如何在昇腾平台上使用PyTorch训练推荐系统中的经典模型DIN(Deep Interest Network)。主要内容包括:DIN网络的创新点与架构剖析、Activation Unit和Attention模块的实现、Amazon-book数据集的介绍与预处理、模型训练过程定义及性能评估。通过实战演示,利用Amazon-book数据集训练DIN模型,最终评估其点击率预测性能。文中还提供了代码示例,帮助读者更好地理解每个步骤的实现细节。
|
2月前
|
算法Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
1171818
|
2月前
|
存储机器学习/深度学习算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
7122
|
29天前
|
机器学习/深度学习算法数据挖掘
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
|
19天前
|
机器学习/深度学习算法数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
|
24天前
|
算法JavaScript数据安全/隐私保护
基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
本内容展示了基于GA(遗传算法)优化的256QAM概率星座整形(PCS)技术的研究与实现。通过Matlab仿真,分析了优化前后星座图和误码率(BER)的变化。256QAM采用非均匀概率分布(Maxwell-Boltzman分布)降低外圈星座点出现频率,减小平均功率并增加最小欧氏距离,从而提升传输性能。GA算法以BER为适应度函数,搜索最优整形参数v,显著降低误码率。核心程序实现了GA优化过程,包括种群初始化、选择、交叉、变异等步骤,并绘制了优化曲线。此研究有助于提高频谱效率和传输灵活性,适用于不同信道环境。
441010

热门文章

最新文章

  • 1
    AI是如何收集体育数据的?从摄像头到算法,揭秘赛场背后的“数字间谍网“!
    38
  • 2
    zk基础—1.一致性原理和算法
    42
  • 3
    内网实时监控中的 C# 算法探索:环形缓冲区在实时数据处理中的关键作用
    56
  • 4
    基于遗传优化ELM网络的时间序列预测算法matlab仿真
    30
  • 5
    基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
    44
  • 6
    NOMA和OFDMA优化算法分析
    48
  • 7
    基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
    44
  • 8
    基于遗传优化算法的带时间窗多车辆路线规划matlab仿真
    42
  • 9
    基于遗传算法的64QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
    30
  • 10
    基于云模型的车辆行驶速度估计算法matlab仿真
    27
  • 推荐镜像

    更多