BP神经网络实验报告资料
BP神经网络理论与实验结果

神经网络简介:神经网络是大脑的一个组成部分。
James 在1890年的《心理学》一书中这样描述神经网络的基本原理:大脑皮层每一点的活力是由其它点势能释放的综合效能产生的,这些势能与如下因素有关:(1)相关点的兴奋次数;(2)兴奋的强度;(3)与其不相连的其它点所接受的能量。
他的这一原理一直沿用至今。
到目前为止,神经网络的研究主要分为两个派别:一派主要包括生物学家、物理学家和心理学家等,他们研究的主要目的是给出大脑活动的描述和精细模型;另一派主要包括工程技术人员等,他们关心的是怎样利用神经网络的基本原理,来构造解决实际问题的算法,使得这些算法具有有效的计算能力,我们称之为神经网络的工程应用研究,或称为人工神经网络(artificial neural network, ANN ),简称为神经网络。
人工神经网络可以分为前向型和反馈型两类:前向型神经网络的特点是信息传递由后层神经元向前层神经元传递,同一层内的神经元之间没有信息交流;反馈型神经网络中的神经元之间不但相互作用,而且自身也有信息内耗。
BP 神经网络是一种多层前向神经网络,名字源于网络权值的调整规则采用的是后向传播学习算法(也称为反推学习规则),即BP 学习算法(back-propagation, BP )。
BP 学习算法是Rumelhart 等在1986年提出的。
至此以后,BP 神经网络得到了广泛的实际应用,据统计,80%~90%的神经网络模型都采用了BP 网络或者它的变形。
BP 神经网络理论BP 神经网络是一种单向传播的多层前向型网络,其结构如图所示。
由图可见,BP 网络是一种具有三层或三层以上的神经网络,包括输入层、中间层(隐层)和输出层。
上下层之间实现全连接,而每层神经元之间无连接。
当一对学习样本提供给网络后,神经元的激活值从输入层经各中间层向输出层传播,在输出层的各神经元获得网络的输入响应。
接下来,按照减少目标输出与误差的方向,从输出层经过各中间层逐步修正各连接权值,最后回到输入层,这种算法称为“误差逆传播算法”,即BP 算法,随着这种误差逆的传播修正不断进行,网络对输入模式响应的正确率也不断上升。
BP人工神经网络试验报告一

学号:北京工商大学人工神经网络实验报告实验一基于BP算法的XX及Matlab实现院(系)专业学生姓名成绩指导教师2011年10月一、 实验目的:1、 熟悉MATLAB 中神经网络工具箱的使用方法;2、了解BP 神经网络各种优化算法的原理;3、掌握BP 神经网络各种优化算法的特点;4、掌握使用BP 神经网络各种优化算法解决实际问题的方法。
二、实验内容:1 案例背景1.1 BP 神经网络概述BP 神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。
在前向传递中,输入信号从输入层经隐含层逐层处理,直至输出层。
每一层的神经元状态只影响下一层神经元状态。
如果输出层得不到期望输出,则转入反向传播,根据预测误差调整网络权值和阈值,从而使BP 神经网络预测输出不断逼近期望输出。
BP 神经网络的拓扑结构如图1.1所示。
图1.1 BP 神经网络拓扑结构图图1.1中1x ,2x , ……n x 是BP 神经网络的输入值1y ,2y , ……n y 是BP 神经的预测值,ij ω和jk ω为BP 神经网络权值。
从图1.1可以看出,BP 神经网络可以看成一个非线性函数,网络输入值和预测值分别为该函数的自变量和因变量。
当输入节点数为n ,输出节点数为m 时,BP 神经网络就表达了从n 个自变量到m 个因变量的函数映射关系。
BP 神经网络预测前首先要训练网络,通过训练使网络具有联想记忆和预测能力。
BP 神经网络的训练过程包括以下几个步骤。
步骤1:网络初始化。
根据系统输入输出序列()y x ,确定网络输入层节点数n 、隐含层节点数l ,输出层节点数m ,初始化输入层、隐含层和输出层神经元之间的连接权值ij ω和jk ω,初始化隐含层阈值a ,输出层阈值b ,给定学习速率和神经元激励函数。
步骤2:隐含层输出计算。
根据输入向量x ,输入层和隐含层间连接权值ij ω以及隐含层阈值a ,计算隐含层输出H 。
式中, l 为隐含层节点数; f 为隐含层激励函数,该函数有多种表达形式,本章所选函数为:步骤3:输出层输出计算。
BP网络实验

实验八 BP网络实验一、实验目的:理解反向传播网络的结构和原理,掌握反向传播算法对神经元的训练过程,了解反向传播公式。
通过构建BP网络实例,熟悉前馈网络的原理及结构。
二、实验原理反向传播(BP)算法是一种计算单个权值变化引起网络性能变化值的较为简单的方法。
BP算法过程从输出节点开始,反向地向第一隐含层(即最接近输入层的隐含层)传播由总误差引起的权值修正。
BP网络不仅含有输入节点和输出节点,而且含有一层或多层隐(层)节点。
输入信号先向前传递到隐节点,经过作用后,再把隐节点的输出信息传递到输出节点,最后给出输出结果。
三、实验条件:1BP网络演示程序。
2IE5.0以上版本,能连通Internet。
四、实验内容:1通过BP网络各项参数的不同设置,观察BP算法的学习效果。
2观察比较BP网络各项参数变化对于训练结果的影响。
五、实验步骤:1设置各层神经元个数设置。
用户点击下拉列表框选择输入、隐含、输出各层神经元个数,其中隐含层神经元个数自动设为输入层神经元个数(n)的2n+1个,然后再点击“确定”按钮,就可以看到所设置BP神经网络示意图以及系统随机生成默认的各层权值。
2学习参数设置,用户点击或拖动各滚动条分别设置样本误差、系统误差、学习速率、动量因子、迭代次数参数值。
3各层权值设置,如果用户使用系统随机生成默认的各层权值,则进行第4步。
用户或选中“自定义权”单选框自定义权各层权,在权值设置文本域设置权值后,单击其后“确定”按钮。
或双击下方列表框选项,相应权值会在权值设置文本域出现,则进行该权值修改后,单击其后“确定”按钮,修改后的权值会成功地列表框的原位修改。
后两种方式均会成功地激活“确定”按钮。
4学习样本设置,单文本域中出现“入层”字样表示在单文本域中设置输入层神经元信号向量。
单文本域中出现“出层”字样表示在单文本域中设置输出层神经元信号向量。
当输入已完成一个或一个以上模式对,“已设置完”单选框会成功地激活,如选中,则“校正网络”按钮会成功地激活。
神经网络基于BP网络的多层感知器实验报告

神经网络基于BP网络的多层感知器实验报告二、基于BP网络的多层感知器一:实验目的:1、理解多层感知器的工作原理2、通过调节算法参数了解参数的变化对于感知器训练的影响3、了解多层感知器局限性二:实验原理:BP的基本思想:信号的正向传播误差的反向传播–信号的正向传播:输入样本从输入层传入,经各隐层逐层处理后,传向输出层。
–误差的反向传播:将输入误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号来作为修正各单元权值的依据。
1、基本BP算法的多层感知器模型:2、BP学习算法的推导:当网络输出与期望输出不等时,存在输出误差E将上面的误差定义式展开至隐层,有进一步展开至输入层,有调整权值的原则是使误差不断地减小,因此应使权值的调整量与误差的梯度下降成正比,即η∈(0,1)表示比例系数,在训练中反应学习速率 BP算法属于δ学习规则类,这类算法被称为误差的梯度下降(Gradient Descent)算法。
<实验步骤>1、用Matlab编程,实现解决该问题的单样本训练BP网络,设置一个停止迭代的误差Emin和最大迭代次数。
在调试过程中,通过不断调整隐层节点数,学习率η,找到收敛速度快且误差小的一组参数。
产生均匀分布在区间[-4,4]的测试样本,输入建立的模型得到输出,与Hermit多项式的期望输出进行比较计算总误差(运行5次,取平均值),并记录下每次迭代结束时的迭代次数。
(要求误差计算使用RME,Emin 设置为0、1)程序如下:function dyb %单样本程序 clc; close all; clear; x0=[1:;-4:0、08:4];%样本个 x0(1,:)=-1; x=x0'; yuzhi=0、1;%阈值j=input('请输入隐层节点数 j = ');%隐层节点数 n=input('请输入学习效率 n = ');%学习效率 w=rand(1,j); w=[yuzhi,w]; %输出层阈值 v=rand(2,j); v(1,:)=yuzhi;%隐层阈值err=zeros(1,); wucha=0; zhaosheng=0、01*randn(1,);%噪声erro=[]; ERRO=[];%误差,为画收敛曲线准备 Emin=0、1;d=zeros(1,); for m=1: d(m)=hermit(x(m,2));%期望 end;o=zeros(1,); j=zeros(1,j); =zeros(1,j); p=1; q=1; azc=0; acs=0; for z=1:5 while q<30000 Erme=0; for p=1:y=zeros(1,j); for i=1:j j(1,i)=x(p,:)*v(:,i);y(1,i)=1/(1+exp(-j(1,i))); end; y=[-1 y];o(p)=w*y'+zhaosheng(p);%噪声 wucha = d(p)-o(p);err(1,p)=1/2*wucha^2; erro=[erro,wucha]; for m=1:j+1w(1,m)=w(1,m)+n*wucha*y(1,m); end; for m=1:jv(:,m)=v(:,m)+n*wucha*w(1,m)*y(1,m)*(1-y(1,m))*x(p,:)'; end q=q+1; end; for t=1:; Erme=Erme+err(1,t); end;err=zeros(1,); Erme=sqrt(Erme/); ERRO=[ERRO,Erme]; ifErme<Emin break; end; end; azc=azc+Erme; acs=acs+q; end disp('最终误差:'); pinjunwucha=1/5*azc figure(1);plot(x(:,2),d,'--r'); hold on; plot(x(:,2),o,'--b'); disp('次数:'); pjcx=1/5*acs figure(2); plot(ERRO); figure(3); plot(x(:,2),d,'--rp');endfunction F =hermit(x)%hermit子函数 F =1、1*(1-x+2*x^2)*exp(-x^2/2);end运行结果如下:表格1、单样本BP算法平均最小误差学习率结点数0、050、070、10、120、150、1880、09650、08590、019530、09450、08740、0925100、09680、09440、09830、09200、08210、0982120、08860、08560、08850、09460、08340、0928150、09150、09270、08780、09240、07380、08442、实现解决该问题的批处理训练BP网络,调整参数如上。
BP神经网络实验报告

作业8编程题实验报告(一)实验内容:实现多层前馈神经网络的反向传播学习算法。
使用3.2节上机生成的数据集对神经网络进行训练和测试,观察层数增加和隐层数增加是否会造成过拟合。
(二)实验原理:1)前向传播:以单隐层神经网络为例(三层神经网络),则对于第k 个输出节点,输出结果为:在实验中采用的激励函数为logistic sigmoid function 。
考虑每一层节点中的偏差项,所以,在上式中:)()(00,1l l j b w x ==在实验中,就相应的需要注意矢量形式表达式中,矢量大小的调整。
2)BP 算法:a) 根据问题,合理选择输入节点,输出节点数,确定隐层数以及各隐层节点数;b) 给每层加权系数,随机赋值;c) 由给定的各层加权系数,应用前向传播算法,计算得到每层节点输出值,并计算对于所有训练样本的均方误差;d) 更新每层加权系数:其中,⎪⎩⎪⎨⎧⋅⋅⋅-=∑+j i ji l i l i i i l i a h w a h d y 其它层,最后一层)('(),(')()1()()(δδe) 重复c),d )迭代过程,直至迭代步数大于预设值,或者每次迭代误差变化值小于预设值时,迭代结束,得到神经网络的各层加权系数。
(三)实验数据及程序:1)实验数据处理:a) 训练样本输入节点数据:在实验中,所用数据中自变量x 的取值,为0—1的25个随机值,为了后续实验结果的分析,将其从小到大排序,并加上偏差项,神经网络的输出节点最终训练结果,即为训练得到的回归结果;b) 训练样本标签值:在实验中,采用的激励函数为logistic sigmoid function ,其值域为[0,1],所以,在神经网络训练前,需要对训练样本标签值进行归一化处理;c) 神经网络输出节点值:对训练样本标签值进行了归一化处理,相应的,对于输出节点,需要反归一化处理。
2)实验程序:实现函数:[Theta]=BP(input_layer_size,hidden_layer_size,hidden_layer_num,num_labels,Niter,leta,X,Y)输入参数:input_layer_size:输入节点数;hidden_layer_size:隐层节点数(对于单隐层,输入值为一数值,对于多隐层,为一矢量);hidden_layer_num:隐层数;num_labels:输出节点数;Niter:为预设的迭代步数;leta:学习速率,即更新步长;X,Y:分别为训练样本输入特征值以及标签值。
实验报告 BP神经网络(2150230509)资料

深圳大学实验报告实验课程名称:神经网络与进化算法实验项目名称:BP神经网络对蝴蝶花进行分类学院:计算机与软件专业:软件工程报告人:文成学号:2150230509 同组人:无指导教师:朱安民实验时间:2016年4月1日至2016年4月7日实验报告提交时间:2016年4月7日教务处制初步熟悉BP神经网络,并设计一个BP神经网络对蝴蝶花进行分类二、实验内容设计一个BP神经网络对蝴蝶花进行分类,要求提交试验报告,内容包括:1.问题说明描。
2.数据述。
3.网络设计,包括输入层、隐含层、输出层节点个数的设计。
4.算法步骤。
5.编程,注意原始数据的通用化,数据输入的随机性。
6.网络训练,注意训练数据与验证数据分开。
7.网络验证7.结果分析,修改隐含层节点个数,修改学习率,分别对结果的影响。
8.体会,例如对下列问题的理解:1)BP学习算法的基本思想?2)BP网络设计中结点个数如何确定?3)为什么要对数据进行通用标准化,即转为[-1,1]?4)为什么要对训练数据的输入顺序进行随机化处理?5)为什么训练数据与测试数据要分开?注意:如果用MatLab编程序,将下列数据存放到一个文本文件(例如data.dat),编写程序存放到一个m文件中(例如你的学号.m),数据文件和程序文件放在同一文件夹下。
运行MatLab后,指定上述文件夹为工作区域,在命令行运行m文件。
前期工作:首先将实验数据分为两组,一组用于训练,一组用于测试。
分别保存在trainData.txt和testData.txt中(115组训练数据和35组测试数据)。
如图所示:各列数据代表的意义如下:序号种类叶长叶宽花长花宽(单位:cm)1 1 49 30 14 22 2 66 29 46 13…150 3 65 33 60 25(本实验设计一个BP网络,先用75%的数据对网络进行训练,然后用25%的数据进行检测。
)网络设计:输入层用4个节点,分别对应文件中的3/4/5/6列,隐层用3个节点。
人工智能实验报告-BP神经网络算法的简单实现[参照]
![人工智能实验报告-BP神经网络算法的简单实现[参照]](https://img.taocdn.com/s3/m/23d1cd32cdbff121dd36a32d7375a417866fc1dc.png)
人工神经网络是一种模仿人脑结构及其功能的信息处理系统,能提高人们对信息处理的智能化水平。
它是一门新兴的边缘和交叉学科,它在理论、模型、算法等方面比起以前有了较大的发展,但至今无根本性的突破,还有很多空白点需要努力探索和研究。
1人工神经网络研究背景神经网络的研究包括神经网络基本理论、网络学习算法、网络模型以及网络应用等方面。
其中比较热门的一个课题就是神经网络学习算法的研究。
近年来己研究出许多与神经网络模型相对应的神经网络学习算法,这些算法大致可以分为三类:有监督学习、无监督学习和增强学习。
在理论上和实际应用中都比较成熟的算法有以下三种:(1) 误差反向传播算法(Back Propagation,简称BP 算法);(2) 模拟退火算法;(3) 竞争学习算法。
目前为止,在训练多层前向神经网络的算法中,BP 算法是最有影响的算法之一。
但这种算法存在不少缺点,诸如收敛速度比较慢,或者只求得了局部极小点等等。
因此,近年来,国外许多专家对网络算法进行深入研究,提出了许多改进的方法。
主要有:(1) 增加动量法:在网络权值的调整公式中增加一动量项,该动量项对某一时刻的调整起阻尼作用。
它可以在误差曲面出现骤然起伏时,减小振荡的趋势,提高网络训练速度;(2) 自适应调节学习率:在训练中自适应地改变学习率,使其该大时增大,该小时减小。
使用动态学习率,从而加快算法的收敛速度;(3) 引入陡度因子:为了提高BP 算法的收敛速度,在权值调整进入误差曲面的平坦区时,引入陡度因子,设法压缩神经元的净输入,使权值调整脱离平坦区。
此外,很多国内的学者也做了不少有关网络算法改进方面的研究,并把改进的算法运用到实际中,取得了一定的成果:(1) 王晓敏等提出了一种基于改进的差分进化算法,利用差分进化算法的全局寻优能力,能够快速地得到BP 神经网络的权值,提高算法的速度;(2) 董国君等提出了一种基于随机退火机制的竞争层神经网络学习算法,该算法将竞争层神经网络的串行迭代模式改为随机优化模式,通过采用退火技术避免网络收敛到能量函数的局部极小点,从而得到全局最优值;(3) 赵青提出一种分层遗传算法与BP 算法相结合的前馈神经网络学习算法。
BP神经网络实验报告要交资料

BP神经网络在红酒分类中的应用信息学院研15 谢青青 1043115267摘要:葡萄酒化学成分复杂,葡萄酒的质量是各种化学成分的综合反映,通常检测的方法有感官评定和常规的理化指标检测,感官评定虽然在生产中也有较多的应用,但是评测周期长,影响因素多,主观性强,重复性差,且无法快速检测。
使用BP神经网络对标准化且具有一致评判标准的数据进行训练,将来分类时仅仅使用理化指标进行评估,不带有人为主观因素。
一、BP网络简介BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。
BP网络能学习和存贮大量的输入输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。
它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。
BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。
下图就是一个简单的BP网络模型:BP神经网络的结构示意图二、BP神经元下图给出了第j个基本BP神经元(节点),它只模仿了生物神经元所具有的三个最基本也是最重要的功能:加权、求和与转移。
其中x1、x2…xi…xn分别代表来自神经元1、2…i…n的输入;wj1、wj2…wji…wjn则分别表示神经元1、2…i…n与第j个神经元的连接强度,即权值;bj 为阈值;f(·)为传递函数;yj为第j个神经元的输出[1]。
第j个神经元的净输入值为:BP神经元其中:若视,,即令及包括及,则于是节点j的净输入可表示为:净输入通过传递函数(Transfer Function)f (·)后,便得到第j个神经元的输出:式中f(·)是单调上升函数,而且必须是有界函数,因为细胞传递的信号不可能无限增加,必有一最大值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江南大学物联网工程学院实验报告课程名称人工智能实验名称BP神经网络实验日期2016-04-30班级计科1305 姓名游思睿学号1030413529实验报告要求1.实验名称2.实验要求3.实验环境4.实验步骤5.实验体会一、实验目的:两个输入a、b(10以内的数),一个输出c,c=a+b。
换句话说就是教BP神经网络加法运算。
二、实验内容:Data 用来表示已经知道的数据样本的数量,也就是训练样本的数量。
In 表示对于每个样本有多少个输入变量; Out 表示对于每个样本有多少个输出变量。
Neuron 表示神经元的数量,TrainC 来表示训练的次数。
再来我们看对神经网络描述的数据定义,来看下面这张图里面的数据类型都是double 型。
d_in[Data][In] 存储Data 个样本,每个样本的In 个输入。
d_out[Data][Out] 存储Data 个样本,每个样本的Out 个输出。
我们用邻接表法来表示图 1 中的网络,w[Neuron][In] 表示某个输入对某个神经元的权重,v[Out][Neuron] 来表示某个神经元对某个输出的权重;与之对应的保存它们两个修正量的数组dw[Neuron][In] 和dv[Out][Neuron]。
数组o[Neuron] 记录的是神经元通过激活函数对外的输出,OutputData[Out] 存储BP神经网络的输出。
初始化主要是涉及两个方面的功能,一方面是对读取的训练样本数据进行归一化处理,归一化处理就是指的就是将数据转换成0~1之间。
在BP神经网络理论里面,并没有对这个进行要求,不过实际实践过程中,归一化处理是不可或缺的。
因为理论模型没考虑到,BP神经网络收敛的速率问题,一般来说神经元的输出对于0~1之间的数据非常敏感,归一化能够显著提高训练效率。
可以用以下公式来对其进行归一化,其中加个常数A 是为了防止出现0 的情况(0不能为分母)。
y=(x-MinValue+A)/(MaxValue-MinValue+A)另一方面,就是对神经元的权重进行初始化了,数据归一到了(0~1)之间,那么权重初始化为(-1~1)之间的数据,另外对修正量赋值为0函数backUpdate(i) 负责的是将预测输出的结果与样本真实的结果进行比对,然后对神经网络中涉及到的权重进行修正,也这是BP神经网络实现的关键所在。
如何求到对于w[Neuron][In] 和v[Out][Neuron] 进行修正的误差量便是关键所在!误差修正量的求法在基本模型一文中数学分析部分有解答,具体问题具体分析,落实到我们设计的这个BP神经网络上来说,需要得到的是对w[Neuron][In] 和v[Out][Neuron] 两个数据进行修正误差,误差量用数据结构dw[Neuron][In] 和 dv[Out][Neuron] 来进行存储。
那么来分析下这两个修正误差量是什么样的?推导的思路与基本模型中推导误差量的一致,这里仅列出对具体对于我们设计的BP神经网络中的数学推导过程:三、实验环境VS2010四、实验步骤(对照截图具体说明,尽量详细)#include <stdio.h>#include <time.h>#include <math.h>#include <stdlib.h>#define Data 820#define In 2#define Out 1#define Neuron 45#define TrainC 20000#define A 0.2#define B 0.4#define a 0.2#define b 0.3double d_in[Data][In],d_out[Data][Out];double w[Neuron][In],o[Neuron],v[Out][Neuron]; double Maxin[In],Minin[In],Maxout[Out],Minout[Out]; double OutputData[Out];double dv[Out][Neuron],dw[Neuron][In];double e;void writeTest(){FILE *fp1,*fp2;double r1,r2;int i;srand((unsigned)time(NULL));if((fp1=fopen("D:\\in.txt","w"))==NULL){printf("can not open the in file\n");exit(0);}if((fp2=fopen("D:\\out.txt","w"))==NULL){printf("can not open the out file\n");exit(0);}for(i=0;i<Data;i++){r1=rand()%1000/100.0;r2=rand()%1000/100.0;fprintf(fp1,"%lf %lf\n",r1,r2);fprintf(fp2,"%lf \n",r1+r2);}fclose(fp1);fclose(fp2);}void readData(){FILE *fp1,*fp2;int i,j;if((fp1=fopen("D:\\in.txt","r"))==NULL){printf("can not open the in file\n");exit(0);}for(i=0;i<Data;i++)for(j=0; j<In; j++)fscanf(fp1,"%lf",&d_in[i][j]);fclose(fp1);if((fp2=fopen("D:\\out.txt","r"))==NULL){printf("can not open the out file\n");exit(0);}for(i=0;i<Data;i++)for(j=0; j<Out; j++)fscanf(fp1,"%lf",&d_out[i][j]);fclose(fp2);}void initBPNework(){int i,j;for(i=0; i<In; i++){Minin[i]=Maxin[i]=d_in[0][i];for(j=0; j<Data; j++){Maxin[i]=Maxin[i]>d_in[j][i]?Maxin[i]:d_in[j][i];Minin[i]=Minin[i]<d_in[j][i]?Minin[i]:d_in[j][i];}}for(i=0; i<Out; i++){Minout[i]=Maxout[i]=d_out[0][i];for(j=0; j<Data; j++){Maxout[i]=Maxout[i]>d_out[j][i]?Maxout[i]:d_out[j][i];Minout[i]=Minout[i]<d_out[j][i]?Minout[i]:d_out[j][i];}}for (i = 0; i < In; i++)d_in[j][i]=(d_in[j][i]-Minin[i]+1)/(Maxin[i]-Minin[i]+1);for (i = 0; i < Out; i++)for(j = 0; j < Data; j++)d_out[j][i]=(d_out[j][i]-Minout[i]+1)/(Maxout[i]-Minout[i]+1);for (i = 0; i < Neuron; ++i)for (j = 0; j < In; ++j){w[i][j]=rand()*2.0/RAND_MAX-1;dw[i][j]=0;}for (i = 0; i < Neuron; ++i)for (j = 0; j < Out; ++j){v[j][i]=rand()*2.0/RAND_MAX-1;dv[j][i]=0;}}void computO(int var){int i,j;double sum,y;for (i = 0; i < Neuron; ++i){sum=0;for (j = 0; j < In; ++j)sum+=w[i][j]*d_in[var][j];o[i]=1/(1+exp(-1*sum));}for (i = 0; i < Out; ++i){sum=0;for (j = 0; j < Neuron; ++j)sum+=v[i][j]*o[j];OutputData[i]=sum;}}void backUpdate(int var){int i,j;double t;{t=0;for (j = 0; j < Out; ++j){t+=(OutputData[j]-d_out[var][j])*v[j][i];dv[j][i]=A*dv[j][i]+B*(OutputData[j]-d_out[var][j])*o[i];v[j][i]-=dv[j][i];}for (j = 0; j < In; ++j){dw[i][j]=a*dw[i][j]+b*t*o[i]*(1-o[i])*d_in[var][j];w[i][j]-=dw[i][j];}}}double result(double var1,double var2){int i,j;double sum,y;var1=(var1-Minin[0]+1)/(Maxin[0]-Minin[0]+1);var2=(var2-Minin[1]+1)/(Maxin[1]-Minin[1]+1);for (i = 0; i < Neuron; ++i){sum=0;sum=w[i][0]*var1+w[i][1]*var2;o[i]=1/(1+exp(-1*sum));}sum=0;for (j = 0; j < Neuron; ++j)sum+=v[0][j]*o[j];return sum*(Maxout[0]-Minout[0]+1)+Minout[0]-1;}void writeNeuron(){FILE *fp1;int i,j;if((fp1=fopen("D:\\neuron.txt","w"))==NULL){printf("can not open the neuron file\n");exit(0);}for (i = 0; i < Neuron; ++i)for (j = 0; j < In; ++j){fprintf(fp1,"%lf ",w[i][j]);}fprintf(fp1,"\n\n\n\n");for (i = 0; i < Neuron; ++i)for (j = 0; j < Out; ++j){fprintf(fp1,"%lf ",v[j][i]);}fclose(fp1);}void trainNetwork(){int i,c=0,j;do{e=0;for (i = 0; i < Data; ++i){computO(i);for (j = 0; j < Out; ++j)e+=fabs((OutputData[j]-d_out[i][j])/d_out[i][j]);backUpdate(i);}printf("%d %lf\n",c,e/Data);c++;}while(c<TrainC && e/Data>0.01);}int main(int argc, char const *argv[]){writeTest();readData();initBPNework();trainNetwork();printf("%lf \n",result(6,8) );printf("%lf \n",result(2.1,7) );printf("%lf \n",result(4.3,8) );writeNeuron();return 0;}五、实验体会教师评价优良中及格不及格教师签名日期。