BP人工神经网络算法的MATLAB实现
(完整版)BP神经网络matlab实例(简单而经典).doc
p=p1';t=t1';[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); % 原始数据归一化net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx'); %设置网络,建立相应的BP 网络net.trainParam.show=2000; % 训练网络net.trainParam.lr=0.01;net.trainParam.epochs=100000;net.trainParam.goal=1e-5;[net,tr]=train(net ,pn,tn); %调用TRAINGDM 算法训练BP 网络pnew=pnew1';pnewn=tramnmx(pnew,minp,maxp);anewn=sim(net,pnewn);anew=postmnmx(anewn,mint,maxt); %对 BP 网络进行仿真%还原数据y=anew';1、 BP 网络构建(1)生成 BP 网络net newff ( PR,[ S1 S2...SNl],{ TF1 TF 2...TFNl }, BTF , BLF , PF ) PR :由R 维的输入样本最小最大值构成的R 2 维矩阵。
[ S1 S2...SNl] :各层的神经元个数。
{TF 1 TF 2...TFNl } :各层的神经元传递函数。
BTF :训练用函数的名称。
(2)网络训练[ net,tr ,Y, E, Pf , Af ] train (net, P, T , Pi , Ai ,VV , TV )(3)网络仿真[Y, Pf , Af , E, perf ] sim(net, P, Pi , Ai ,T ){'tansig','purelin'},'trainrp'BP 网络的训练函数训练方法梯度下降法有动量的梯度下降法自适应 lr 梯度下降法自适应 lr 动量梯度下降法弹性梯度下降法训练函数traingd traingdm traingda traingdx trainrpFletcher-Reeves 共轭梯度法traincgf Ploak-Ribiere 共轭梯度法traincgpPowell-Beale 共轭梯度法traincgb 量化共轭梯度法trainscg 拟牛顿算法trainbfg 一步正割算法trainoss Levenberg-Marquardt trainlmBP 网络训练参数训练参数net.trainParam.epochsnet.trainParam.goal net.trainParam.lrnet.trainParam.max_fail net.trainParam.min_grad net.trainParam.show net.trainParam.timenet.trainParam.mc net.trainParam.lr_inc 参数介绍最大训练次数(缺省为10)训练要求精度(缺省为0)学习率(缺省为0.01 )最大失败次数(缺省为5)最小梯度要求(缺省为1e-10)显示训练迭代过程( NaN 表示不显示,缺省为 25)最大训练时间(缺省为inf )动量因子(缺省0.9)学习率lr增长比(缺省为1.05)训练函数traingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingd 、traingdm 、traingda 、traingdx 、 trainrp 、 traincgf 、traincgp 、traincgb 、trainscg、trainbfg 、 trainoss、 trainlmtraingdm 、 traingdx traingda 、traingdxnet.trainParam.lr_dec 学习率 lr 下降比(缺省为 0.7) traingda 、 traingdxnet.trainParam.max_perf_inc 表现函数增加最大比(缺省traingda 、 traingdx为 1.04)net.trainParam.delt_inc 权值变化增加量(缺省为trainrp1.2)net.trainParam.delt_dec 权值变化减小量(缺省为trainrp0.5)net.trainParam.delt0 初始权值变化(缺省为 0.07) trainrpnet.trainParam.deltamax 权值变化最大值(缺省为trainrp50.0)net.trainParam.searchFcn 一维线性搜索方法(缺省为traincgf 、traincgp 、traincgb 、srchcha)trainbfg 、 trainossnet.trainParam.sigma 因为二次求导对权值调整的trainscg影响参数(缺省值 5.0e-5)mbda Hessian 矩阵不确定性调节trainscg参数(缺省为 5.0e-7)net.trainParam.men_reduc 控制计算机内存/ 速度的参trainlm量,内存较大设为1,否则设为 2(缺省为 1)net.trainParam.mu 的初始值(缺省为0.001) trainlmnet.trainParam.mu_dec 的减小率(缺省为0.1)trainlmnet.trainParam.mu_inc 的增长率(缺省为10)trainlmnet.trainParam.mu_max 的最大值(缺省为1e10)trainlm2、 BP 网络举例举例 1、%traingdclear;clc;P=[-1 -1 2 2 4;0 5 0 5 7];T=[-1 -1 1 1 -1];%利用 minmax函数求输入样本范围net = newff(minmax(P),T,[5,1],{'tansig','purelin'},'trainrp');net.trainParam.show=50;%net.trainParam.lr=0.05;net.trainParam.epochs=300;net.trainParam.goal=1e-5;[net,tr]=train(net,P,T);net.iw{1,1}%隐层权值net.b{1}%隐层阈值net.lw{2,1}%输出层权值net.b{2}%输出层阈值sim(net,P)BP 神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
(完整版)BP神经网络matlab实例(简单而经典)
p=p1';t=t1';[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始数据归一化net=newff(minmax(pn),[5,1],{'tansig','purelin'},'traingdx');%设置网络,建立相应的BP网络net.trainParam.show=2000; % 训练网络net.trainParam.lr=0.01;net.trainParam.epochs=100000;net.trainParam.goal=1e-5;[net,tr]=train(net ,pn,tn); %调用TRAINGDM算法训练BP 网络pnew=pnew1';pnewn=tramnmx(pnew,minp,maxp);anewn=sim(net,pnewn); %对BP网络进行仿真anew=postmnmx(anewn,mint,maxt); %还原数据y=anew';1、BP网络构建(1)生成BP网络=net newff PR S S SNl TF TF TFNl BTF BLF PF(,[1 2...],{ 1 2...},,,)PR:由R维的输入样本最小最大值构成的2R⨯维矩阵。
S S SNl:各层的神经元个数。
[ 1 2...]{ 1 2...}TF TF TFNl:各层的神经元传递函数。
BTF:训练用函数的名称。
(2)网络训练[,,,,,] (,,,,,,)=net tr Y E Pf Af train net P T Pi Ai VV TV(3)网络仿真=[,,,,] (,,,,)Y Pf Af E perf sim net P Pi Ai T{'tansig','purelin'},'trainrp'2、BP网络举例举例1、%traingdclear;clc;P=[-1 -1 2 2 4;0 5 0 5 7];T=[-1 -1 1 1 -1];%利用minmax函数求输入样本范围net = newff(minmax(P),T,[5,1],{'tansig','purelin'},'trainrp');net.trainParam.show=50;%net.trainParam.lr=0.05;net.trainParam.epochs=300;net.trainParam.goal=1e-5;[net,tr]=train(net,P,T);net.iw{1,1}%隐层权值net.b{1}%隐层阈值net.lw{2,1}%输出层权值net.b{2}%输出层阈值sim(net,P)举例2、利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。
基于MATLAB的BP人工神经网络设计
浙江大学出版社 ! 杨 健 刚- 人 工 神 经 网 络 实 用 教 程- 杭 州 : , !,,’ , ’ 杨 竹 清 - "#$%#&<-) 辅 助 神 经 网 络 设 计 - 北 京 : 电 ; 柳林, 子工业出版社, !,,; , ’-
7 调 用 >4?00 函 数 建 立 输 入 层 为 ) 个 神 经 元 、 中 间 层 为 ’) 个 神 经
网络的应用 假定有以下四组输入数据, 如表 ! 所示:
将其数据输入训练好的神经网络可以得到以下结果如 图 !。
本文在各层间采用的传递函数为 / 形函数,因为其具 有完成分类的非线形特征,有具有实现误差计算所需要的 可微特性, 而且比较接近于人工神经元的输入—输出特点。 其函数表达式为: ( 0 1 )2
( C )从 后 向 前 计 算 隐 含 层 的 误 差 信 号 " ( ) " ,=?< ,= &B< ,= ! ! ,+ " ;
,=
&(4 %’ 神 经 网 络 算 法 的 数 学 描 述
一个隐含层、 输出层和非线 %’ 神 经 网 络 是 由 输 入 层 、 性兴奋函数 ( 51/6.17 )组 成 的 三 层 感 知 器 网 络 。 它是在导师 指导下适合于多层神经元网络的一种学习,建立在梯度算 法的基础之上。 这种网络对于输入信息, 要先向前传播到隐 含层的节点上, 经 过 各 单 元 的 特 性 为 51/6.17 型 的 激 活 函 数 运算后, 把隐含节点的输出信息传播到输出节点, 最后给出 输出结果。 网络的学习过程由正向和反向传播两部分组成: 在正向传播过程中,每一层的神经元的状态只影响下一层 的神经元网络;如果输出层不能得出期望输出即实际输出 值与期望输出值之间有误差, 那么转入反向传播过程, 将误
BP神经网络原理及其MATLAB应用
BP神经网络原理及其MATLAB应用BP神经网络(Back Propagation Neural Network)是一种基于梯度下降算法的人工神经网络模型,具有较广泛的应用。
它具有模拟人类神经系统的记忆能力和学习能力,可以用来解决函数逼近、分类和模式识别等问题。
本文将介绍BP神经网络的原理及其在MATLAB中的应用。
BP神经网络的原理基于神经元间的权值和偏置进行计算。
一个标准的BP神经网络通常包含三层:输入层、隐藏层和输出层。
输入层负责接收输入信息,其节点数与输入维度相同;隐藏层用于提取输入信息的特征,其节点数可以根据具体问题进行设定;输出层负责输出最终的结果,其节点数根据问题的要求决定。
BP神经网络的训练过程可以分为前向传播和反向传播两个阶段。
前向传播过程中,输入信息逐层传递至输出层,通过对神经元的激活函数进行计算,得到神经网络的输出值。
反向传播过程中,通过最小化损失函数的梯度下降算法,不断调整神经元间的权值和偏置,以减小网络输出与实际输出之间的误差,达到训练网络的目的。
在MATLAB中,可以使用Neural Network Toolbox工具箱来实现BP神经网络。
以下是BP神经网络在MATLAB中的应用示例:首先,需导入BP神经网络所需的样本数据。
可以使用MATLAB中的load函数读取数据文件,并将其分为训练集和测试集:```data = load('dataset.mat');inputs = data(:, 1:end-1);targets = data(:, end);[trainInd, valInd, testInd] = dividerand(size(inputs, 1), 0.6, 0.2, 0.2);trainInputs = inputs(trainInd, :);trainTargets = targets(trainInd, :);valInputs = inputs(valInd, :);valTargets = targets(valInd, :);testInputs = inputs(testInd, :);testTargets = targets(testInd, :);```接下来,可以使用MATLAB的feedforwardnet函数构建BP神经网络模型,并进行网络训练和测试:```hiddenLayerSize = 10;net = feedforwardnet(hiddenLayerSize);net = train(net, trainInputs', trainTargets');outputs = net(testInputs');```最后,可以使用MATLAB提供的performance函数计算网络的性能指标,如均方误差、相关系数等:```performance = perform(net, testTargets', outputs);```通过逐步调整网络模型的参数和拓扑结构,如隐藏层节点数、学习率等,可以进一步优化BP神经网络的性能。
BP神经网络的MATLAB实现总结
作者:陈克忠本文章数据来自于网络概述:本篇文章主要总结了运用MATLAB工具实现BP神经网络的预测功能的步骤,然后结合算例写出MATLAB程序。
1,步骤总结BP神经网络可以用来做时间序列的预测,下面给出用MATLAB实现预测的步骤。
1,整理原始数据2,将原始数据分为训练数据和测试数据两类3,分别对训练数据和测试数据进行归一化处理(关于为什么要归一化网上有很多解释)4,确定隐含成神经元个数,用MATLAB函数建立网络5,设置训练参数进行训练6,测试网络,即用训练好的网络来对一组数据进行预测7,将第6步得到的预测结果反归一化,得到与原始数据同一数量级的数据8,误差分析二,算例分析下面将结合算例运用MATLAB实现BP神经网络的预测。
1. 问题的描述公路运量主要包括公路的客运量和公路货运量两个方面。
公路运量主要包括公路的客运量和公路货运量两个方面。
据研究,某地区的公路运量主要与该地区的人数、研究,某地区的公路运量主要与该地区的人数、机动车数量和公路面积有关,下图给出了某县1990-2009年20年的数据结合数据运用MATLAB工具建立BP神经网络对该县今后公路客运量和货运量进行预测。
程序如下:clearclc%%1,整理原始数据sqrts=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];%人口数量sqjdcs=[0.6 0.75 0.85 0.91 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1];%机动车数量sqglmj=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79];%公路面积glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];%公路客运量glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804];%公路货运量p=[sqrts;sqjdcs;sqglmj];%输入t=[glkyl;glhyl];%输出%%2,将原始数据分类为训练数据和测试数据p_train = p(:,1:19);t_train = t(:,1:19);p_test = p(:,20);t_test = t(:,20);%%3,归一化训练数据和测试数据[pn_train,minp,maxp,tn_train,mint,maxt]=premnmx(p_train,t_train);%将输入数据归一化pn_test=tramnmx(p_test,minp,maxp);%将测试数据归一化%4确定隐含层神经元个数,并建立网络n = 6;net = newff(pn_train,tn_train,n);%5设置网络参数%该案例运用默认参数%6训练网络net = train(net,pn_train,tn_train);%6运用测试数据仿真results=sim(net,pn_test);%对预测数据进行反归一化results=postmnmx(results,mint,maxt);%误差分析err = t_test – results %预测数据与真实数据之间的差值err2 = err./t_test %误差率plot(t_test,'b');hold onplot(results,'r');如图红线为预测值,蓝线为真实值年份 2004 2005 2006 2007 2008 2009 人口数量 47.30 52.89 55.73 56.76 59.17 60.63 机动车数量 2.50 2.60 2.702.85 2.953.10 公路面积 0.56 0.59 0.59 0.67 0.69 0.79 公路客运量 25107 33442 36836 40548 42927 43462 公路货运量 13320 16762 18673 20724 20803 21804。
BP_AI_神经网络MATLAB实现
end
E(i,1) = sqrt(E(i,1));
%计算隐层误差以及delta
%delta_s = sum(delta(k)*W(j,k)*Yj*(1-Yj))
BP_LEARN_D = BP_data;
%计算BP矩阵维数
[N,M] = size(BP_data);
P= N;
%方程为E
E = zeros(N,1);
%读取理想输出数据
Y = BP_LEARN_D(1:N,M-Y_num+1:M);
X = BP_LEARN_D(1:N,1:M-Y_num);
for j=1:1:sec_echo
for k = 1:1:Y_num
delta_s(j,1) = delta_o(k,1)*V(j,k);
end;
delta_s(j,1) = delta_s(j,1)*Ysec_f(j,1)*(ቤተ መጻሕፍቲ ባይዱ-Ysec_f(j,1));
end;
%计算delta_w以及delta_v
%delta_v = eta .*(delta_o*Y')'
%delta_w = eta .* (delta_s*X')'
delta_v = eta .*(delta_o*Ysec_f')';
delta_w = eta .*(delta_s*X(i,:))';
x_line = N;
x_row = M-Y_num;
%计算隐层节点输入,采用式凑法
%m=sqrt(n+l)+ a a取值(1:10)
BP神经网络matlab实现的基本步骤
1、数据归一化2、数据分类,主要包括打乱数据顺序,抽取正常训练用数据、变量数据、测试数据3、建立神经网络,包括设置多少层网络(一般3层以内既可以,每层的节点数(具体节点数,尚无科学的模型和公式方法确定,可采用试凑法,但输出层的节点数应和需要输出的量个数相等),设置隐含层的传输函数等。
关于网络具体建立使用方法,在后几节的例子中将会说到。
4、指定训练参数进行训练,这步非常重要,在例子中,将详细进行说明5、完成训练后,就可以调用训练结果,输入测试数据,进行测试6、数据进行反归一化7、误差分析、结果预测或分类,作图等数据归一化问题归一化的意义:首先说一下,在工程应用领域中,应用BP网络的好坏最关键的仍然是输入特征选择和训练样本集的准备,若样本集代表性差、矛盾样本多、数据归一化存在问题,那么,使用多复杂的综合算法、多精致的网络结构,建立起来的模型预测效果不会多好。
若想取得实际有价值的应用效果,从最基础的数据整理工作做起吧,会少走弯路的。
归一化是为了加快训练网络的收敛性,具体做法是:1 把数变为(0,1)之间的小数主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。
2 把有量纲表达式变为无量纲表达式归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量比如,复数阻抗可以归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了,没有量纲。
另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。
神经网络归一化方法:由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如下几种,供大家参考:1、线性函数转换,表达式如下:复制内容到剪贴板代码:y=(x-MinValue)/(MaxValue-MinValue)说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
BP人工神经网络及matlab实现
功能 对数Sigmoid激活函数 格式 a = logsig(N) 说明对数Sigmoid函数把神经元
的输入范围从(-∞,+∞)映射到(0, 1)。它是可导函数,适用于BP训 练的神经元。
5-4 一个简单的例子
下表为某药品的销售情况,现构建一个如下的三层BP神经网 络对药品的销售进行预测:输入层有三个结点,隐含层结点数为5, 隐含层的激活函数为tansig;输出层结点数为1个,输出层的激活 函数为logsig,并利用此网络对药品的销售量进行预测,预测方法 采用滚动预测方式,即用前三个月的销售量来预测第四个月的销 售量,如用1、2、3月的销售量为输入预测第4个月的销售量,用2、 3、4月的销售量为输入预测第5个月的销售量.如此反复直至满足预 测精度要求为止。
e = e yio who yio who
p
(
yio(k)= who
h
whohoh(k)-bo)
who
=hoh(k)
e
yio
=(12oq=1(do(k)-yoo(k)))2 yio
=-(do(k)-yoo(k))yoo
(k)
=-(do(k)-yoo(k))f(yio(k)) -o(k)
5-2 BP网络的学习算法
情况二的直观表达
当误差对权值的偏导数 小于零时,权值调整量 为正,实际输出少于期 望输出,权值向增大方 向调整,使得实际输出 与期望输出的差减少。
e
who
w
e
h
o
<0,
此时Δwho>0
演示
BP算法 手控
5-3 BP神经网络的重要函数和基本功能
5-3-1 BP神经网络的重要函数
函数名 newff() tansig() logsig() traingd()
BP神经网络实验详解(MATLAB实现)
BP神经网络实验详解(MATLAB实现)BP(Back Propagation)神经网络是一种常用的人工神经网络结构,用于解决分类和回归问题。
在本文中,将详细介绍如何使用MATLAB实现BP神经网络的实验。
首先,需要准备一个数据集来训练和测试BP神经网络。
数据集可以是一个CSV文件,每一行代表一个样本,每一列代表一个特征。
一般来说,数据集应该被分成训练集和测试集,用于训练和测试模型的性能。
在MATLAB中,可以使用`csvread`函数来读取CSV文件,并将数据集划分为输入和输出。
假设数据集的前几列是输入特征,最后一列是输出。
可以使用以下代码来实现:```matlabdata = csvread('dataset.csv');input = data(:, 1:end-1);output = data(:, end);```然后,需要创建一个BP神经网络模型。
可以使用MATLAB的`patternnet`函数来创建一个全连接的神经网络模型。
该函数的输入参数为每个隐藏层的神经元数量。
下面的代码创建了一个具有10个隐藏神经元的单隐藏层BP神经网络:```matlabhidden_neurons = 10;net = patternnet(hidden_neurons);```接下来,需要对BP神经网络进行训练。
可以使用`train`函数来训练模型。
该函数的输入参数包括训练集的输入和输出,以及其他可选参数,如最大训练次数和停止条件。
下面的代码展示了如何使用`train`函数来训练模型:```matlabnet = train(net, input_train, output_train);```训练完成后,可以使用训练好的BP神经网络进行预测。
可以使用`net`模型的`sim`函数来进行预测。
下面的代码展示了如何使用`sim`函数预测测试集的输出:```matlaboutput_pred = sim(net, input_test);```最后,可以使用各种性能指标来评估预测的准确性。
基于MATLAB的BP人工神经网络设计
基于MATLAB的BP人工神经网络设计目录
一、介绍1
1.1研究背景1
1.2BP神经网络1
二、BP神经网络的设计3
2.1BP神经网络模型原理3
2.2BP神经网络模型参数5
2.3权重偏置矩阵更新方法6
三、MATLAB实现BP神经网络8
3.1MATLAB软件环境8
3.2代码实现8
3.3实验结果10
四、结论及展望12
一、介绍
1.1研究背景
人工神经网络(ANNs)被归类为一种模拟生物神经网络的模型,具有高度学习能力和自适应性,用于解决有关模式识别、拟合曲线、识别图像、辨识声音、推理、预测等问题。
在这些任务中,Backpropagation (BP)神
经网络是应用最广泛的神经网络结构。
BP神经网络是一种反向传播的多
层前馈神经网络,它的结构简单、计算方法有效,可以学习训练集的特征,在测试集上取得较好的精度。
1.2BP神经网络
BP神经网络(或叫反向传播网络,BP网络)是一种多层前馈神经网络,它是由对神经网络训练的单步算法“反向传播算法”δ开发的。
BP神经
网络由输入层、隐层和输出层构成,它将被调节的参数及权值分配给每个
网络层,以调整网络性能的训练过程。
人工神经网络Matlab实现代码
以下是用Matlab中的m语言编写的BP神经网络代码,实现的是一个正弦函数的拟合过程,包括了初始化、BP算法、绘制曲线等过程,可以将代码放到一个M文件中运行,以下是代码:defaultpoints=20; %%%%%%%%%隐含层节点数inputpoints=1; %%%%%%%%%输入层节点数outputpoints=1; %%%%%%%%%输出层节点数Testerror=zeros(1,100);%%%%每个测试点的误差记录a=zeros(1,inputpoints);%%%%输入层节点值y=zeros(1,outputpoints);%%%样本节点输出值w=zeros(inputpoints,defaultpoints);%%%%%输入层和隐含层权值%初始化权重很重要,比如用rand函数初始化则效果非常不确定,不如用zeros初始化v=zeros(defaultpoints,outputpoints);%%%%隐含层和输出层权值bin=rand(1,defaultpoints);%%%%%隐含层输入bout=rand(1,defaultpoints);%%%%隐含层输出base1=0*ones(1,defaultpoints);%隐含层阈值,初始化为0cin=rand(1,outputpoints);%%%%%%输出层输入cout=rand(1,outputpoints);%%%%%输出层输出base2=0*rand(1,outputpoints);%%输出层阈值error=zeros(1,outputpoints);%%%拟合误差errors=0;error_sum=0; %%%误差累加和error_rate_cin=rand(defaultpoints,outputpoints);%%误差对输出层节点权值的导数error_rate_bin=rand(inputpoints,defaultpoints);%%%误差对输入层节点权值的导数alfa=0.5; %%%% alfa 是隐含层和输出层权值-误差变化率的系数,影响很大belt=0.5; %%%% belt 是隐含层和输入层权值-误差变化率的系数,影响较小gama=5; %%%% gama 是误差放大倍数,可以影响跟随速度和拟合精度,当gama大于2时误差变大,容易震荡%%%%规律100个隐含节点,当alfa *gama =1.5时,效果好,其他值误差变大,belt基本不影响效果%%%%规律200个隐含节点,当alfa *gama =0.7时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样%%%%规律50个隐含节点,当alfa *gama =3时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样trainingROUND=200;% 训练次数,有时训练几十次比训练几百次上千次效果要好很多sampleNUM=361; % 样本点数x1=zeros(sampleNUM,inputpoints); %样本输入矩阵y1=zeros(sampleNUM,outputpoints); %样本输出矩阵x2=zeros(sampleNUM,inputpoints); %测试输入矩阵y2=zeros(sampleNUM,outputpoints); %测试输出矩阵observeOUT=zeros(sampleNUM,outputpoints); %%拟合输出监测点矩阵i=0;j=0;k=0; %%%%其中j是在一个训练周期中的样本点序号,不可引用i=0;h=0;o=0; %%%%输入层序号,隐含层序号,输出层序号x=0:0.2*pi:2*pi; %%%%步长for j=1:9 %%%%%%这里给样本输入和输出赋值,应根据具体应用来设定x1(j,1)=x(j);y1(j,1)=sin(x1(j,1));endx=0:2*pi/361:2*pi;for j=1:361x2(j,1)=x(j);y2(j,1)=sin(x2(j,1));endfor o=1:outputpointsy1(:,o)=(y1(:,o)-min(y1(:,o)))/(max(y1(:,o))-min(y1(:,o)));%归一化,使得输出范围落到[0,1]区间上,当激活函数为对数S型时适用y2(:,o)=(y2(:,o)-min(y2(:,o)))/(max(y2(:,o))-min(y2(:,o)));endfor i=1:inputpointsx1(:,i)=(x1(:,i)-min(x1(:,i)))/(max(x1(:,i))-min(x1(:,i)));%输入数据归一化范围要和输出数据的范围相同,[0,1]x2(:,i)=(x2(:,i)-min(x2(:,i)))/(max(x2(:,i))-min(x2(:,i)));endsampleNUM=9;for mmm=1:trainingROUND %训练开始,100次error_sum=0;if mmm==trainingROUNDsampleNUM=361;endfor j=1:sampleNUM %%%%%每次训练一个样本点for i=1:inputpoints %%%%%样本输入层赋值a(i)=x1(j,i);endfor o=1:outputpoints %%%%%样本输出层赋值y(o)=y1(j,o);endif mmm==trainingROUNDfor i=1:inputpoints %%%%%样本输入层赋值a(i)=x2(j,i);endfor o=1:outputpoints %%%%%样本输出层赋值y(o)=y2(j,o);endendfor h=1:defaultpointsbin(h)=0;for i=1:inputpointsbin(h)=bin(h)+a(i)*w(i,h);endbin(h)=bin(h)-base1(h);bout(h)=1/(1+exp(-bin(h)));%%%%%%隐含层激励函数为对数激励endtemp_error=0;for o=1:outputpointscin(o)=0;for h=1:defaultpointscin(o)=cin(o)+bout(h)*v(h,o);endcin(o)=cin(o)-base2(o);cout(o)=1/(1+exp(-cin(o))); %%%%%%输出层激励函数为对数激励observeOUT(j,o)=cout(o);error(o)=y(o)-cout(o);temp_error=temp_error+error(o)*error(o);%%%%%记录实际误差,不应该乘伽玛系数error(o)=gama*error(o);endTesterror(j)=temp_error;error_sum=error_sum+Testerror(j);for o=1:outputpointserror_rate_cin(o)=error(o)*cout(o)*(1-cout(o));endfor h=1:defaultpointserror_rate_bin(h)=0;for o=1:outputpointserror_rate_bin(h)= error_rate_bin(h)+error_rate_cin(o)*v(h,o);enderror_rate_bin(h)=error_rate_bin(h)*bout(h)*(1-bout(h));endfor h=1:defaultpointsbase1(h)=base1(h)-5*error_rate_bin(h)*bin(h);%%%%base1变化不影响最小误差,但是可以抑制由于过多训练产生的发散效果for o=1:outputpointsv(h,o)=v(h,o)+alfa*error_rate_cin(o)*bout(h); % 可能要改,正负号?% base1(i)=base1(i)+0.01*alfa*error(i);endfor i=1:inputpointsw(i,h)=w(i,h)+belt*error_rate_bin(h)*a(i); % 可能要改,正负号?%base2=base2+0.01*belt*out_error;endendend%%%%%%%%一轮训练结束if(error_sum<0.01)%%%%error_sum中记录一轮训练中所有样本的所有输出和拟合输出值差值平方和break;endend %//训练结束figureplot(x(1:sampleNUM),Testerror(1:sampleNUM),'r+')hold onplot(x(1:sampleNUM),y2(1:sampleNUM,1),'*')hold onplot(x(1:sampleNUM),observeOUT(1:sampleNUM,1),'o')hold onylabel(num2str(mmm));xlabel(num2str(error_sum));。
(整理)BP神经网络matlab实现和matlab工具箱使用实例.
(整理)BP神经网络matlab实现和matlab工具箱使用实例.BP神经网络matlab实现和matlab工具箱使用实例经过最近一段时间的神经网络学习,终于能初步使用matlab实现BP网络仿真试验。
这里特别感谢研友sistor2004的帖子《自己编的BP算法(工具:matlab)》和研友wangleisxcc的帖子《用C++,Matlab,Fortran实现的BP算法》前者帮助我对BP算法有了更明确的认识,后者让我对matlab下BP函数的使用有了初步了解。
因为他们发的帖子都没有加注释,对我等新手阅读时有一定困难,所以我把sistor2004发的程序稍加修改后加注了详细解释,方便新手阅读。
%严格按照BP网络计算公式来设计的一个matlab程序,对BP网络进行了优化设计%yyy,即在o(k)计算公式时,当网络进入平坦区时(<0.0001)学习率加大,出来后学习率又还原%v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j); 动量项clear allclcinputNums=3; %输入层节点outputNums=3; %输出层节点hideNums=10; %隐层节点数maxcount=20000; %最大迭代次数samplenum=3; %一个计数器,无意义precision=0.001; %预设精度yyy=1.3; %yyy是帮助网络加速走出平坦区alpha=0.01; %学习率设定值a=0.5; %BP优化算法的一个设定值,对上组训练的调整值按比例修改字串9error=zeros(1,maxcount+1); %error数组初始化;目的是预分配内存空间errorp=zeros(1,samplenum); %同上v=rand(inputNums,hideNums); %3*10;v初始化为一个3*10的随机归一矩阵; v表输入层到隐层的权值deltv=zeros(inputNums,hideNums); %3*10;内存空间预分配dv=zeros(inputNums,hideNums); %3*10;w=rand(hideNums,outputNums); %10*3;同Vdeltw=zeros(hideNums,outputNums);%10*3dw=zeros(hideNums,outputNums); %10*3samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255]; %3*3;指定输入值3*3(实为3个向量)expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11]; %3*3;期望输出值3*3(实为3个向量),有导师的监督学习count=1;while (count<=maxcount) %结束条件1迭代20000次c=1;while (c<=samplenum)for k=1:outputNumsd(k)=expectlist(c,k); %获得期望输出的向量,d(1:3)表示一个期望向量内的值endfor i=1:inputNumsx(i)=samplelist(c,i); %获得输入的向量(数据),x(1:3)表一个训练向量字串4end%Forward();for j=1:hideNumsnet=0.0;for i=1:inputNumsnet=net+x(i)*v(i,j);%输入层到隐层的加权和∑X(i)V(i)endy(j)=1/(1+exp(-net)); %输出层处理f(x)=1/(1+exp(-x))单极性sigmiod函数endfor k=1:outputNumsnet=0.0;for j=1:hideNumsnet=net+y(j)*w(j,k);endif count>=2&&error(count)-error(count+1)<=0.0001o(k)=1/(1+exp(-net)/yyy); %平坦区加大学习率else o(k)=1/(1+exp(-net)); %同上endend%BpError(c)反馈/修改;errortmp=0.0;for k=1:outputNumserrortmp=errortmp+(d(k)-o(k))^2; %第一组训练后的误差计算enderrorp(c)=0.5*errortmp; %误差E=∑(d(k)-o(k))^2 * 1/2%end%Backward();for k=1:outputNumsyitao(k)=(d(k)-o(k))*o(k)*(1-o(k)); %输入层误差偏导字串5endfor j=1:hideNumstem=0.0;for k=1:outputNumstem=tem+yitao(k)*w(j,k); %为了求隐层偏导,而计算的∑endyitay(j)=tem*y(j)*(1-y(j)); %隐层偏导end%调整各层权值for j=1:hideNumsfor k=1:outputNumsdeltw(j,k)=alpha*yitao(k)*y(j); %权值w的调整量deltw(已乘学习率)w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%权值调整,这里的dw=dletw(t-1),实际是对BP算法的一个dw(j,k)=deltw(j,k); %改进措施--增加动量项目的是提高训练速度endendfor i=1:inputNumsfor j=1:hideNumsdeltv(i,j)=alpha*yitay(j)*x(i); %同上deltwv(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);dv(i,j)=deltv(i,j);endendc=c+1;end%第二个while结束;表示一次BP训练结束double tmp;tmp=0.0; 字串8for i=1:samplenumtmp=tmp+errorp(i)*errorp(i);%误差求和endtmp=tmp/c;error(count)=sqrt(tmp);%误差求均方根,即精度if (error(count)<precision)%另一个结束条件< p="">break;endcount=count+1;%训练次数加1end%第一个while结束error(maxcount+1)=error(maxcount);p=1:count;pp=p/50;plot(pp,error(p),"-"); %显示误差然后下面是研友wangleisxcc的程序基础上,我把初始化网络,训练网络,和网络使用三个稍微集成后的一个新函数bpnet %简单的BP神经网络集成,使用时直接调用bpnet就行%输入的是p-作为训练值的输入% t-也是网络的期望输出结果% ynum-设定隐层点数一般取3~20;% maxnum-如果训练一直达不到期望误差之内,那么BP迭代的次数一般设为5000% ex-期望误差,也就是训练一小于这个误差后结束迭代一般设为0.01% lr-学习率一般设为0.01% pp-使用p-t虚拟蓝好的BP网络来分类计算的向量,也就是嵌入二值水印的大组系数进行训练然后得到二值序列% ww-输出结果% 注明:ynum,maxnum,ex,lr均是一个值;而p,t,pp,ww均可以为向量字串1% 比如p是m*n的n维行向量,t那么为m*k的k维行向量,pp为o*i的i维行向量,ww为o* k的k维行向量%p,t作为网络训练输入,pp作为训练好的网络输入计算,最后的ww作为pp经过训练好的BP训练后的输出function ww=bpnet(p,t,ynum,maxnum,ex,lr,pp)plot(p,t,"+");title("训练向量");xlabel("P");ylabel("t");[w1,b1,w2,b2]=initff(p,ynum,"tansig",t,"purelin"); %初始化含一个隐层的BP网络zhen=25; %每迭代多少次更新显示biglr=1.1; %学习慢时学习率(用于跳出平坦区)litlr=0.7; %学习快时学习率(梯度下降过快时)a=0.7 %动量项a大小(△W(t)=lr*X*ん+a*△W(t-1))tp=[zhen maxnum ex lr biglr litlr a 1.04]; %trainbpx[w1,b1,w2,b2,ep,tr]=trainbpx(w1,b1,"tansig",w2,b2,"purelin", p,t,tp);ww=simuff(pp,w1,b1,"tansig",w2,b2,"purelin"); %ww就是调用结果下面是bpnet使用简例:%bpnet举例,因为BP网络的权值初始化都是随即生成,所以每次运行的状态可能不一样。
BP神经网络的设计实例(MATLAB编程)
神经网络的设计实例(MATLAB编程)例1 采用动量梯度下降算法训练BP 网络。
训练样本定义如下:输入矢量为p =[-1 -2 3 1-1 1 5 -3]目标矢量为t = [-1 -1 1 1]解:本例的MATLAB 程序如下:close allclearecho onclc% NEWFF——生成一个新的前向神经网络% TRAIN——对BP 神经网络进行训练% SIM——对BP 神经网络进行仿真pause% 敲任意键开始clc% 定义训练样本P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量T=[-1, -1, 1, 1]; % T 为目标矢量pause;clc% 创建一个新的前向神经网络net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值inputWeights=net.IW{1,1}inputbias=net.b{1}% 当前网络层权值和阈值layerWeights=net.LW{2,1}layerbias=net.b{2}pauseclc% 设置训练参数net.trainParam.show = 50;net.trainParam.lr = 0.05;net.trainParam.mc = 0.9;net.trainParam.epochs = 1000;net.trainParam.goal = 1e-3;pauseclc% 调用TRAINGDM 算法训练BP 网络[net,tr]=train(net,P,T);pauseclc% 对BP 网络进行仿真A = sim(net,P)% 计算仿真误差E = T - AMSE=mse(E)pauseclcecho off例2 采用贝叶斯正则化算法提高BP 网络的推广能力。
在本例中,我们采用两种训练方法,即L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。
BP神经网络实验-Matlab
BP神经网络实验-MatlabBP神经网络是一种常见的人工神经网络模型。
在实际应用中,BP神经网络广泛用于分类、预测、优化等任务中。
本文将介绍如何在Matlab中实现BP神经网络,并通过一个简单的分类问题进行实验验证。
1. 数据准备首先,我们需要准备数据。
本文采用的数据是一个二分类问题,即在一个二维平面中,将数据点分为两类。
为了方便起见,我们可以手动生成一些数据点,或者使用Matlab自带的数据集如“fisheriris”。
2. BP神经网络模型的构建在Matlab中,我们可以使用“newff”函数来构建BP神经网络模型。
该函数可以接受多个参数,包括输入层、隐含层和输出层的节点数量,以及激活函数、学习算法等参数。
以下是构建一个包含1个输入层、1个隐含层和1个输出层的BP神经网络的示例代码:4. BP神经网络模型的测试在训练完成后,我们可以使用BP神经网络模型对测试数据进行分类预测。
在Matlab 中,我们可以使用“sim”函数来预测分类结果。
以下是对测试数据进行分类预测的示例代码:output=round(sim(net,test_data));其中,“output”是分类预测结果;“test_data”是测试数据。
5. 性能评估最后,我们需要对BP神经网络模型的分类性能进行评估。
在Matlab中,我们可以使用“confusionmat”函数来计算分类矩阵,进而计算分类准确率等性能指标。
以下是计算分类准确率的示例代码:[C,order]=confusionmat(test_label,output);accuracy=(C(1,1)+C(2,2))/sum(sum(C));其中,“C”是分类矩阵;“order”是分类标签;“accuracy”是分类准确率。
BP神经网络(原理及MATLAB实现)
BP神经⽹络(原理及MATLAB实现)⼈⼯神经⽹络概述:⼈⼯神经元模型:神经⽹络的分类:按照连接⽅式,可以分为:前向神经⽹络 vs. 反馈(递归)神经⽹络;按照学习⽅式,可以分为:有导师学习神经⽹络 vs. ⽆导师学习神经⽹络;按照实现功能,可以分为:拟合(回归)神经⽹络 vs. 分类神经⽹络。
数据归⼀化:将数据映射到[0, 1]或[-1, 1]区间或其他的区间。
数据归⼀化的原因:1.输⼊数据的单位不⼀样,有些数据的范围可能特别⼤,导致的结果是神经⽹络收敛慢、训练时间长。
2.数据范围⼤的输⼊在模式分类中的作⽤可能会偏⼤,⽽数据范围⼩的输⼊作⽤就可能会偏⼩。
3.由于神经⽹络输出层的激活函数的值域是有限制的,因此需要将⽹络训练的⽬标数据映射到激活函数的值域。
例如神经⽹络的输出层若采⽤S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经⽹络的输出只能限制在(0,1),所以训练数据的输出就要归⼀化到[0,1]区间。
4.S形激活函数在(0,1)区间以外区域很平缓,区分度太⼩。
例如S形函数f(X)在参数a=1时,f(100)与f(5)只相差0.0067。
归⼀化算法:1.y = ( x - min )/( max - min );2.y = 2 * ( x - min ) / ( max - min ) - 1。
部分函数:参数对BP神经⽹络性能的影响:隐含层神经元节点个数激活函数类型的选择学习率初始权值与阈值交叉验证训练集测试集验证集留⼀法MATLAB实现程序:1 %% I. 清空环境变量2 clear all3 clc45 %% II. 训练集/测试集产⽣6 %%7 % 1. 导⼊数据8 load spectra_data.mat910 %%11 % 2. 随机产⽣训练集和测试集12 temp = randperm(size(NIR,1));13 % 训练集——50个样本14 P_train = NIR(temp(1:50),:)';15 T_train = octane(temp(1:50),:)';16 % 测试集——10个样本17 P_test = NIR(temp(51:end),:)';18 T_test = octane(temp(51:end),:)';19 N = size(P_test,2);2021 %% III. 数据归⼀化22 [p_train, ps_input] = mapminmax(P_train,0,1);23 p_test = mapminmax('apply',P_test,ps_input);2425 [t_train, ps_output] = mapminmax(T_train,0,1);2627 %% IV. BP神经⽹络创建、训练及仿真测试28 %%29 % 1. 创建⽹络30 net = newff(p_train,t_train,9);3132 %%33 % 2. 设置训练参数34 net.trainParam.epochs = 1000;35 net.trainParam.goal = 1e-3;36 net.trainParam.lr = 0.01;3738 %%39 % 3. 训练⽹络40 net = train(net,p_train,t_train);4142 %%43 % 4. 仿真测试44 t_sim = sim(net,p_test);4546 %%47 % 5. 数据反归⼀化48 T_sim = mapminmax('reverse',t_sim,ps_output);4950 %% V. 性能评价51 %%52 % 1. 相对误差error53 error = abs(T_sim - T_test)./T_test;5455 %%56 % 2. 决定系数R^257 R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); 5859 %%60 % 3. 结果对⽐61 result = [T_test' T_sim' error']6263 %% VI. 绘图64 figure65 plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')66 legend('真实值','预测值')67 xlabel('预测样本')68 ylabel('⾟烷值')69 string = {'测试集⾟烷值含量预测结果对⽐';['R^2=' num2str(R2)]};70 title(string)运⾏效果截图:。
BP神经网络的MATLAB语法介绍
BP神经网络的MATLAB语法介绍BP神经网络(Back Propagation Neural Network)是一种常用的人工神经网络算法,其目的是通过反向传播算法来训练网络模型,实现模式识别和函数逼近等任务。
在MATLAB中,可以使用Neural Network Toolbox来实现BP神经网络模型的构建和训练。
本文将介绍BP神经网络的MATLAB语法,包括网络的构建、训练、预测和模型评估等方面。
一、网络构建1.网络结构定义在MATLAB中,可以使用feedforwardnet函数来定义BP神经网络的结构。
该函数有两个参数,第一个参数是一个向量,表示每一层的节点数;第二个参数是一个向量,表示每一层的传输函数。
例如,下面的代码定义了一个具有2个输入节点、10个隐藏节点和1个输出节点的BP神经网络:```net = feedforwardnet([2, 10, 1]);```2.网络参数初始化网络参数初始化可以使用init函数,其参数是一个BP神经网络对象。
例如,下面的代码将使用init函数来初始化上一步中定义的网络对象:```net = init(net);```二、训练网络1.数据准备在训练BP神经网络之前,需要将数据集划分为输入和输出,然后进行数据归一化处理。
在MATLAB中,可以使用mat2cell函数将数据集划分为输入和输出集合,使用mapminmax函数来归一化数据。
例如,下面的代码将数据集划分为输入集合和输出集合,并进行数据归一化处理:```inputs = mat2cell(data(:, 1:end-1)', size(data, 2)-1,ones(size(data, 1), 1));outputs = mat2cell(data(:, end)', ones(size(data, 1), 1), 1);[input, inputPS] = mapminmax(cat(2, inputs{:}));[output, outputPS] = mapminmax(cat(2, outputs{:}));```2.训练参数设置在训练BP神经网络之前,需要设置一些训练参数,例如训练算法和最大训练次数。
BP人工神经网络算法的MATLAB实现
%% 清空环境变量clcclear%% 训练数据预测数据提取及归一化%下载四类语音信号load data1 c1load data2 c2load data3 c3load data4 c4%四个特征信号矩阵合成一个矩阵data(1:500,:)=c1(1:500,:);data(501:1000,:)=c2(1:500,:);data(1001:1500,:)=c3(1:500,:);data(1501:2000,:)=c4(1:500,:);%从1到2000间随机排序k=rand(1,2000);[m,n]=sort(k);%输入输出数据input=data(:,2:25);output1 =data(:,1);%把输出从1维变成4维for i=1:2000switch output1(i)case 1output(i,:)=[1 0 0 0];case 2output(i,:)=[0 1 0 0];case 3output(i,:)=[0 0 1 0];case 4output(i,:)=[0 0 0 1];endend%随机提取1500个样本为训练样本,500个样本为预测样本input_train=input(n(1:1500),:)';output_train=output(n(1:1500),:)';input_test=input(n(1501:2000),:)';output_test=output(n(1501:2000),:)';%输入数据归一化[inputn,inputps]=mapminmax(input_train);%% 网络结构初始化innum=24;midnum=25;outnum=4;%权值初始化w1=rands(midnum,innum);b1=rands(midnum,1);w2=rands(midnum,outnum);b2=rands(outnum,1);w2_1=w2;w2_2=w2_1;w1_1=w1;w1_2=w1_1;b1_1=b1;b1_2=b1_1;b2_1=b2;b2_2=b2_1;%学习率xite=0.1alfa=0.01;%% 网络训练for ii=1:10E(ii)=0;for i=1:1:1500%% 网络预测输出x=inputn(:,i);% 隐含层输出for j=1:1:midnumI(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j)));end% 输出层输出yn=w2'*Iout'+b2;%% 权值阀值修正%计算误差e=output_train(:,i)-yn;E(ii)=E(ii)+sum(abs(e));%计算权值变化率dw2=e*Iout;db2=e';for j=1:1:midnumS=1/(1+exp(-I(j)));FI(j)=S*(1-S);endfor k=1:1:innumfor j=1:1:midnumdw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));endendw1=w1_1+xite*dw1';b1=b1_1+xite*db1';w2=w2_1+xite*dw2';b2=b2_1+xite*db2';w1_2=w1_1;w1_1=w1;w2_2=w2_1;w2_1=w2;b1_2=b1_1;b1_1=b1;b2_2=b2_1;b2_1=b2;endend%% 语音特征信号分类inputn_test=mapminmax('apply',input_test,inputps);for ii=1:1for i=1:500%1500%隐含层输出for j=1:1:midnumI(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);Iout(j)=1/(1+exp(-I(j)));endfore(:,i)=w2'*Iout'+b2;endend%% 结果分析%根据网络输出找出数据属于哪类for i=1:500output_fore(i)=find(fore(:,i)==max(fore(:,i))); end%BP网络预测误差error=output_fore-output1(n(1501:2000))';%画出预测语音种类和实际语音种类的分类图figure(1)plot(output_fore,'r')hold onplot(output1(n(1501:2000))','b')legend('预测语音类别','实际语音类别')%画出误差图figure(2)plot(error)title('BP网络分类误差','fontsize',12)xlabel('语音信号','fontsize',12)ylabel('分类误差','fontsize',12)%print -dtiff -r600 1-4k=zeros(1,4);%找出判断错误的分类属于哪一类for i=1:500if error(i)~=0[b,c]=max(output_test(:,i));switch ccase 1k(1)=k(1)+1;case 2k(2)=k(2)+1;case 3k(3)=k(3)+1;case 4k(4)=k(4)+1;endendend%找出每类的个体和kk=zeros(1,4);for i=1:500[b,c]=max(output_test(:,i)); switch ccase 1kk(1)=kk(1)+1;case 2kk(2)=kk(2)+1;case 3kk(3)=kk(3)+1;case 4kk(4)=kk(4)+1;endend%正确率rightridio=(kk-k)./kk。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%% 清空环境变量clc
clear
%% 训练数据预测数据提取及归一化
%下载四类语音信号
load data1 c1
load data2 c2
load data3 c3
load data4 c4
%四个特征信号矩阵合成一个矩阵
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001:1500,:)=c3(1:500,:);
data(1501:2000,:)=c4(1:500,:);
%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);
%输入输出数据
input=data(:,2:25); output1 =data(:,1);
%把输出从1维变成4维
for i=1:2000
switch output1(i)
case 1
output(i,:)=[1 0 0 0]; case 2
output(i,:)=[0 1 0 0]; case 3
output(i,:)=[0 0 1 0]; case 4
output(i,:)=[0 0 0 1]; end
end
%随机提取1500个样本为训练样本,500个样本为预测样本input_train=input(n(1:1500),:)';
output_train=output(n(1:1500),:)';
input_test=input(n(1501:2000),:)';
output_test=output(n(1501:2000),:)';
%输入数据归一化
[inputn,inputps]=mapminmax(input_train);
%% 网络结构初始化
innum=24;
midnum=25;
outnum=4;
%权值初始化
w1=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,outnum);
b2=rands(outnum,1);
w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;
%学习率
xite=0.1
alfa=0.01;
%% 网络训练
for ii=1:10
E(ii)=0;
for i=1:1:1500
%% 网络预测输出
x=inputn(:,i);
% 隐含层输出
for j=1:1:midnum
I(j)=inputn(:,i)'*w1(j,:)'+b1(j); Iout(j)=1/(1+exp(-I(j))); end
% 输出层输出
yn=w2'*Iout'+b2;
%% 权值阀值修正
%计算误差
e=output_train(:,i)-yn;
E(ii)=E(ii)+sum(abs(e));
%计算权值变化率
dw2=e*Iout;
db2=e';
for j=1:1:midnum
S=1/(1+exp(-I(j)));
FI(j)=S*(1-S);
end
for k=1:1:innum
for j=1:1:midnum
dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2 (j,4));
db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
end
end
w1=w1_1+xite*dw1';
b1=b1_1+xite*db1';
w2=w2_1+xite*dw2';
b2=b2_1+xite*db2';
w1_2=w1_1;w1_1=w1;
w2_2=w2_1;w2_1=w2;
b1_2=b1_1;b1_1=b1;
b2_2=b2_1;b2_1=b2;
end
end
%% 语音特征信号分类
inputn_test=mapminmax('apply',input_test,inputps); for ii=1:1
for i=1:500%1500
%隐含层输出
for j=1:1:midnum
I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);
Iout(j)=1/(1+exp(-I(j)));
end
fore(:,i)=w2'*Iout'+b2;
end
end
%% 结果分析
%根据网络输出找出数据属于哪类
for i=1:500
output_fore(i)=find(fore(:,i)==max(fore(:,i))); end %BP网络预测误差
error=output_fore-output1(n(1501:2000))';
%画出预测语音种类和实际语音种类的分类图
figure(1)
plot(output_fore,'r')
hold on
plot(output1(n(1501:2000))','b') legend('预测语音类别','实际语音类别') %画出误差图
figure(2)
plot(error)
title('BP网络分类误差','fontsize',12) xlabel('语音信号','fontsize',12) ylabel('分类误差','fontsize',12)
%print -dtiff -r600 1-4
k=zeros(1,4);
%找出判断错误的分类属于哪一类
for i=1:500
if error(i)~=0
[b,c]=max(output_test(:,i));
switch c
case 1
k(1)=k(1)+1;
case 2
k(2)=k(2)+1;
case 3
k(3)=k(3)+1;
case 4
k(4)=k(4)+1;
end
end
end
%找出每类的个体和
kk=zeros(1,4);
for i=1:500
[b,c]=max(output_test(:,i)); switch c case 1
kk(1)=kk(1)+1;
case 2
kk(2)=kk(2)+1;
case 3
kk(3)=kk(3)+1;
case 4
kk(4)=kk(4)+1;
end
end
%正确率
rightridio=(kk-k)./kk。