Python3实现BP神经网络

news/2024/12/18 19:22:38/

主要是实现了这位大佬的代码,顺便加了一些自己的理解http://www.cnblogs.com/Finley/p/5946000.html

import math
import random
random.seed(0)
def rand(a,b): #随机函数return (b-a)*random.random()+adef make_matrix(m,n,fill=0.0):#创建一个指定大小的矩阵mat = []for i in range(m):mat.append([fill]*n)return mat#定义sigmoid函数和它的导数
def sigmoid(x):return 1.0/(1.0+math.exp(-x))
def sigmoid_derivate(x):return x*(1-x) #sigmoid函数的导数class BPNeuralNetwork:def __init__(self):#初始化变量self.input_n = 0self.hidden_n = 0self.output_n = 0self.input_cells = []self.hidden_cells = []self.output_cells = []self.input_weights = []self.output_weights = []self.input_correction = []self.output_correction = []#三个列表维护:输入层,隐含层,输出层神经元def setup(self,ni,nh,no):self.input_n = ni+1 #输入层+偏置项self.hidden_n = nh  #隐含层self.output_n = no  #输出层#初始化神经元self.input_cells = [1.0]*self.input_nself.hidden_cells= [1.0]*self.hidden_nself.output_cells= [1.0]*self.output_n#初始化连接边的边权self.input_weights = make_matrix(self.input_n,self.hidden_n) #邻接矩阵存边权:输入层->隐藏层self.output_weights = make_matrix(self.hidden_n,self.output_n) #邻接矩阵存边权:隐藏层->输出层#随机初始化边权:为了反向传导做准备--->随机初始化的目的是使对称失效for i in range(self.input_n):for h in range(self.hidden_n):self.input_weights[i][h] = rand(-0.2 , 0.2) #由输入层第i个元素到隐藏层第j个元素的边权为随机值for h in range(self.hidden_n):for o in range(self.output_n):self.output_weights[h][o] = rand(-2.0, 2.0) #由隐藏层第i个元素到输出层第j个元素的边权为随机值#保存校正矩阵,为了以后误差做调整self.input_correction = make_matrix(self.input_n , self.hidden_n)self.output_correction = make_matrix(self.hidden_n,self.output_n)#输出预测值def predict(self,inputs):#对输入层进行操作转化样本for i in range(self.input_n-1):self.input_cells[i] = inputs[i] #n个样本从0~n-1#计算隐藏层的输出,每个节点最终的输出值就是权值*节点值的加权和for j in range(self.hidden_n):total = 0.0for i in range(self.input_n):total+=self.input_cells[i]*self.input_weights[i][j]# 此处为何是先i再j,以隐含层节点做大循环,输入样本为小循环,是为了每一个隐藏节点计算一个输出值,传输到下一层self.hidden_cells[j] = sigmoid(total) #此节点的输出是前一层所有输入点和到该点之间的权值加权和for k in range(self.output_n):total = 0.0for j in range(self.hidden_n):total+=self.hidden_cells[j]*self.output_weights[j][k]self.output_cells[k] = sigmoid(total) #获取输出层每个元素的值return self.output_cells[:]  #最后输出层的结果返回#反向传播算法:调用预测函数,根据反向传播获取权重后前向预测,将结果与实际结果返回比较误差def back_propagate(self,case,label,learn,correct):#对输入样本做预测self.predict(case) #对实例进行预测output_deltas = [0.0]*self.output_n #初始化矩阵for o in range(self.output_n):error = label[o] - self.output_cells[o] #正确结果和预测结果的误差:0,1,-1output_deltas[o]= sigmoid_derivate(self.output_cells[o])*error#误差稳定在0~1内#隐含层误差hidden_deltas = [0.0]*self.hidden_nfor h in range(self.hidden_n):error = 0.0for o in range(self.output_n):error+=output_deltas[o]*self.output_weights[h][o]hidden_deltas[h] = sigmoid_derivate(self.hidden_cells[h])*error#反向传播算法求W#更新隐藏层->输出权重for h in range(self.hidden_n):for o in range(self.output_n):change = output_deltas[o]*self.hidden_cells[h]#调整权重:上一层每个节点的权重学习*变化+矫正率self.output_weights[h][o] += learn*change + correct*self.output_correction[h][o]#更新输入->隐藏层的权重for i in range(self.input_n):for h in range(self.hidden_n):change = hidden_deltas[h]*self.input_cells[i]self.input_weights[i][h] += learn*change + correct*self.input_correction[i][h]self.input_correction[i][h] =  change#获取全局误差error = 0.0for o in range(len(label)):error = 0.5*(label[o]-self.output_cells[o])**2 #平方误差函数return errordef train(self,cases,labels,limit=10000,learn=0.05,correct=0.1):for i in range(limit): #设置迭代次数error = 0.0for j in range(len(cases)):#对输入层进行访问label = labels[j]case = cases[j]error+=self.back_propagate(case,label,learn,correct) #样例,标签,学习率,正确阈值def test(self): #学习异或cases = [[0, 0],[0, 1],[1, 0],[1, 1],] #测试样例labels = [[0], [1], [1], [0]] #标签self.setup(2,5,1) #初始化神经网络:输入层,隐藏层,输出层元素个数self.train(cases,labels,10000,0.05,0.1) #可以更改for case in  cases:print(self.predict(case))if __name__ == '__main__':nn = BPNeuralNetwork()nn.test()



http://www.ppmy.cn/news/503810.html

相关文章

人工智能——BP神经网络

BP神经网络应该是所有神经网络里面的比较简单易懂的一种。 当然,python是有BP神经网络的库,但是我这次要给的代码,是我自己根据网上大佬的案例,自己手动编写的一个隐含层的一个神经网络模型。 代码的流程如下: 1.读取…

用Matlab创建BP神经网络

前言 最近在自学吴恩达的机器学习,还有学校的数据挖掘课程。课程结课设计要求剖析一个分类器程序,这是我在网上找的一篇文章(ANN神经网络入门——分类问题(MATLAB) https://blog.csdn.net/u012321457/article/det…

c# Bp神经网络

使用了周志华老师写的机器学习中的神经网络的公式,具体公式可以看《机器学习》--周志华第103页,用的时标准BP算法 具体代码在下面,注释明确 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

BP算法的回归

近日看模式识别相关的书,接触到一些常见的机器学习算法,虽然书中对于算法的理论介绍很清晰,但是很少给出算法的具体函数定义,所以我就想通过书中的介绍和已有别人的代码,自己整理出来算法的matlab实现。 BP算法通常用…

运用Matlab创建BP神经网络

运用Matlab创建BP神经网络(R2010b) 一、BP神经网络属于前向网络 1、以下为创建BP神经网络的方法及参数意义 netnewff(P,T,S)或者net newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF) 参数说明: (1)P:输入参…

BP神经网络算法改进

周志华机器学习BP改进 试设计一个算法,能通过动态调整学习率显著提升收敛速度,编程实现该算法,并选择两个UCI数据集与标准的BP算法进行实验比较。 1.方法设计 传统的BP算法改进主要有两类: - 启发式算法:如附加动量法…

BP网络常用传递函数

文章转自 https://wenku.baidu.com/view/6b85a07f0066f5335a8121a8.html 侵删 BP网络常用传递函数: BP网络的传递函数有多种。Log-sigmoid型函数的输入值可取任意值,输出值在0和1之间;tan-sigmod型传递函数tansig的输入值可取任意值,输出值在…

BP神经网络经典例子

BP神经网络经典例子—— 基于近红外光谱的汽油辛烷值测试 我这里找到了两个不同的代码(matlab实现),都可以试一下,需要数据文件的再可以找我要下,第一个方法比较简练,第二个十分详细(图多)。 代码&#…