bp神经网络及matlab实现
- 格式:doc
- 大小:434.50 KB
- 文档页数:19
基于遗传算法的BP神经网络MATLAB代码以下是基于遗传算法的BP神经网络的MATLAB代码,包括网络初始化、适应度计算、交叉运算、突变操作和迭代训练等。
1.网络初始化:```matlabfunction net = initialize_network(input_size, hidden_size, output_size)net.input_size = input_size;net.hidden_size = hidden_size;net.output_size = output_size;net.hidden_weights = rand(hidden_size, input_size);net.output_weights = rand(output_size, hidden_size);net.hidden_biases = rand(hidden_size, 1);net.output_biases = rand(output_size, 1);end```2.适应度计算:```matlabfunction fitness = calculate_fitness(net, data, labels)output = forward_propagation(net, data);fitness = sum(sum(abs(output - labels)));end```3.前向传播:```matlabfunction output = forward_propagation(net, data)hidden_input = net.hidden_weights * data + net.hidden_biases;hidden_output = sigmoid(hidden_input);output_input = net.output_weights * hidden_output +net.output_biases;output = sigmoid(output_input);endfunction result = sigmoid(x)result = 1 ./ (1 + exp(-x));end```4.交叉运算:```matlabfunction offspring = crossover(parent1, parent2)point = randi([1 numel(parent1)]);offspring = [parent1(1:point) parent2((point + 1):end)]; end```5.突变操作:```matlabfunction mutated = mutation(individual, mutation_rate) for i = 1:numel(individual)if rand < mutation_ratemutated(i) = rand;elsemutated(i) = individual(i);endendend```6.迭代训练:```matlabfunction [best_individual, best_fitness] =train_network(data, labels, population_size, generations, mutation_rate)input_size = size(data, 1);hidden_size = round((input_size + size(labels, 1)) / 2);output_size = size(labels, 1);population = cell(population_size, 1);for i = 1:population_sizepopulation{i} = initialize_network(input_size, hidden_size, output_size);endbest_individual = population{1};best_fitness = calculate_fitness(best_individual, data, labels);for i = 1:generationsfor j = 1:population_sizefitness = calculate_fitness(population{j}, data, labels);if fitness < best_fitnessbest_individual = population{j};best_fitness = fitness;endendselected = selection(population, data, labels);for j = 1:population_sizeparent1 = selected{randi([1 numel(selected)])};parent2 = selected{randi([1 numel(selected)])};offspring = crossover(parent1, parent2);mutated_offspring = mutation(offspring, mutation_rate);population{j} = mutated_offspring;endendendfunction selected = selection(population, data, labels) fitnesses = zeros(length(population), 1);for i = 1:length(population)fitnesses(i) = calculate_fitness(population{i}, data, labels);end[~, indices] = sort(fitnesses);selected = population(indices(1:floor(length(population) / 2)));end```这是一个基于遗传算法的简化版BP神经网络的MATLAB代码,使用该代码可以初始化神经网络并进行迭代训练,以获得最佳适应度的网络参数。
求用matlab编BP神经网络预测程序求一用matlab编的程序P=[。
];输入T=[。
];输出% 创建一个新的前向神经网络net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm')% 当前输入层权值和阈值inputWeights=net_1.IW{1,1}inputbias=net_1.b{1}% 当前网络层权值和阈值layerWeights=net_1.LW{2,1}layerbias=net_1.b{2}% 设置训练参数net_1.trainParam.show = 50;net_1.trainParam.lr = 0.05;net_1.trainParam.mc = 0.9;net_1.trainParam.epochs = 10000;net_1.trainParam.goal = 1e-3;% 调用TRAINGDM 算法训练BP 网络[net_1,tr]=train(net_1,P,T);% 对BP 网络进行仿真A = sim(net_1,P);% 计算仿真误差E = T - A;MSE=mse(E)x=[。
]';%测试sim(net_1,x) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%不可能啊我200928对初学神经网络者的小提示第二步:掌握如下算法:2.最小均方误差,这个原理是下面提到的神经网络学习算法的理论核心,入门者要先看《高等数学》(高等教育出版社,同济大学版)第8章的第十节:“最小二乘法”。
3.在第2步的基础上看Hebb学习算法、SOM和K-近邻算法,上述算法都是在最小均方误差基础上的改进算法,参考书籍是《神经网络原理》(机械工业出版社,Simon Haykin著,中英文都有)、《人工神经网络与模拟进化计算》(清华大学出版社,阎平凡,张长水著)、《模式分类》(机械工业出版社,Richard O. Duda等著,中英文都有)、《神经网络设计》(机械工业出版社,Martin T. Hargan等著,中英文都有)。
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代码附录5:BP神经网络预测的matlab代码: P=[ 00.13860.21970.27730.32190.35840.38920.41590.43940.46050.47960.49700.52780.55450.59910.60890.61820.62710.63560.64380.65160.65920.66640.67350.72220.72750.73270.73780.74270.74750.75220.75680.76130.76570.7700]T=[0.4455 0.323 0.4116 0.3255 0.4486 0.2999 0.4926 0.2249 0.48930.2357 0.4866 0.22490.4819 0.2217 0.4997 0.2269 0.5027 0.217 0.5155 0.1918 0.5058 0.2395 0.4541 0.2408 0.4054 0.2701 0.3942 0.3316 0.2197 0.2963 0.5576 0.1061 0.4956 0.267 0.5126 0.2238 0.5314 0.2083 0.5191 0.208 0.5133 0.18480.5089 0.242 0.4812 0.2129 0.4927 0.287 0.4832 0.2742 0.5969 0.24030.5056 0.2173 0.5364 0.1994 0.5278 0.2015 0.5164 0.2239 0.4489 0.2404 0.4869 0.2963 0.4898 0.1987 0.5075 0.2917 0.4943 0.2902 ]threshold=[0 1]net=newff(threshold,[11,2],{'tansig','logsig'},'trainlm');net.trainParam.epochs=6000net.trainParam.goal=0.01LP.lr=0.1;net=train(net,P',T')P_test=[ 0.77420.77840.78240.78640.79020.7941 ] out=sim(net,P_test')友情提示:以上面0.7742为例0.7742=ln(47+1)/5因为网络输入有一个元素,对应的是测试时间,所以P只有一列,Pi=log(t+1)/10,这样做的目的是使得这些数据的范围处在[0 1]区间之内,但是事实上对于logsin命令而言输入参数是正负区间的任意值,而将输出值限定于0到1之间。
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实现)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);```最后,可以使用各种性能指标来评估预测的准确性。
4.3.1 BP 神经网络的概述:BP 神经网络[9]由Rumelhard 和McClelland 于1986年提出的,从结构上讲,它是一种典型的多层前向型神经网络,具有一个输入层、数个隐含层(可以是一层,也可以是多层)和一个输出层。
层与层之间采用全链接的方式,同一层的神经元多采用线性传递函数。
图1.1,所示,为一个典型的BP 神经网络结构,该网络具有一个隐含层,输入层神经元数目为m ,隐含层神经元数目为l ,输出层神经元数目为n ,隐含层采用S 型传递函数tansig ,输出层传递函数为purelin.4.3.2 BP 神经网络的学习算法思想BP 神经网络的误差反向传播算法是典型的有导师指导的学习算法,其学习过程由信号的正向传播与误差的反向传播两个过程组成。
正向传播时,输入样本从输入层传入,经各隐层处理后,传向输出层。
若输出层的实际输出与期望输出不符,则转入误差的反向传播阶段。
误差反传播时,将输出误差以某种形式通过隐含层向输入层逐渐反传,并将误差分摊,经各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元误差的依据,这种信号正向传播与误差反向传播的各层权值的调整过程是周而复始的进行的。
权值的不断调整过程,就是网络的学习过程,此过程直到网络输出的误差减少到可以接受的程度或进行到预先设定的学习次数为止。
BP 神经网络的精髓是将网络的输出与期望输出间的误差归结为权值和阈值的“过错”,通过反向传播把误差“分摊”给各个神经元的权值和阈值。
BP 神经网络的学习算法的指导思想是权值和阈值的调整要沿着误差函数下降最快的方向——负梯度方向。
4.3.3 BP 神经网络的学习过程一般习惯将单隐含层前馈网络称为三层网络或三层感知网,即输入层,隐含层,输出层。
输入向量13n (x x x ...x TX =,2,,).若加入0x 1=-,可为隐含层神经元引入阈值,隐含层输出向量为13n (,,TY y y y y =,2,),若加入0y 1=-,可为输出层引入阈值,隐含层各神经元为13n (...TO O O O =,2,,O ).输入层与隐含层神经元间的网络权值矩阵与隐含层与输出层神经元间的网络权值矩阵分别为11111121m 111121222m 111l1l2lm ....W ωωωωωωωωω⎛⎫ ⎪ ⎪= ⎪ ⎪ ⎪⎝⎭, 22211121m 222221222m 222l1l2lm ....W ωωωωωωωωω⎛⎫ ⎪ ⎪= ⎪ ⎪ ⎪⎝⎭(4.6) 隐含层神经元的阈值1θ和输出层神经元的阈值2θ分别为1111'11l =[,...,]θθθθ,, 2222'11l =[,...,]θθθθ, (4.7)则隐含层神经元的的输出为m11j ji i j j i=1=f x -=f net O ωθ∑()(),j=1,2,…,l (4.8) 其中,m11j ji i j i=1net =x -ωθ∑,j=1,2,…,l ;f (.)为隐含层的传递函数。
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 神经⽹络⽤于回归任务MATLAB 实例:BP 神经⽹络⽤于回归(⾮线性拟合)任务作者:凯鲁嘎吉 - 博客园问题描述给定多元(多维)数据X ,有真实结果Y ,对这些数据进⾏拟合(回归),得到拟合函数的参数,进⽽得到拟合函数,现在进来⼀些新样本,对这些新样本进⾏预测出相应地Y 值。
通常的最⼩⼆乘法进⾏线性拟合并不适⽤于所有数据,对于⼤多数数据⽽⾔,他们的拟合函数是⾮线性的,⼈为构造拟合函数相当困难,没有⼀定的经验积累很难完美的构造出符合条件的拟合函数。
因此神经⽹络在这⾥被应⽤来做回归(拟合)任务,进⼀步⽤来预测。
神经⽹络是很强⼤的拟合⼯具,虽然数学可解释性差,但拟合效果好,因⽽得到⼴泛应⽤。
BP 神经⽹络是最基础的⽹络结构,输⼊层,隐层,输出层,三层结构。
如下图所⽰。
整体的⽬标函数就是均⽅误差L =||f (X )−Y ||22其中(激活函数可以⾃⾏设定)f (X )=purelin W 2⋅tan sig (W 1⋅X +b 1)+b 2N : 输⼊数据的个数D : 输⼊数据的维度D 1: 隐层节点的个数X : 输⼊数据(D *N )Y : 真实输出(1*N )W 1: 输⼊层到隐层的权值(D 1*D )b 1: 隐层的偏置(D 1*1)W 2: 输⼊层到隐层的权值(1*D 1)b 2: 隐层的偏置(1*1)通过给定训练数据与训练标签来训练⽹络的权值与偏置,进⼀步得到拟合函数f (X )。
这样,来了新数据后,直接将新数据X 代⼊函数f (X ),即可得到预测的结果。
y = tansig(x) = 2/(1+exp(-2*x))-1;y = purelin(x) = x ;()MATLAB程序⽤到的数据为UCI数据库的housing数据:输⼊数据,最后⼀列是真实的输出结果,将数据打乱顺序,95%的作为训练集,剩下的作为测试集。
这⾥隐层节点数为20。
BP_kailugaji.mfunction errorsum=BP_kailugaji(data_load, NodeNum, ratio)% Author:凯鲁嘎吉 https:///kailugaji/% Input:% data_load: 最后⼀列真实输出结果% NodeNum: 隐层节点个数% ratio: 训练集占总体样本的⽐率[Num, ~]=size(data_load);data=data_load(:, 1:end-1);real_label=data_load(:, end);k=rand(1,Num);[~,n]=sort(k);kk=floor(Num*ratio);%找出训练数据和预测数据input_train=data(n(1:kk),:)';output_train=real_label(n(1:kk))';input_test=data(n(kk+1:Num),:)';output_test=real_label(n(kk+1:Num))';%选连样本输⼊输出数据归⼀化[inputn,inputps]=mapminmax(input_train);[outputn,outputps]=mapminmax(output_train);%% BP⽹络训练% %初始化⽹络结构net=newff(inputn, outputn, NodeNum);net.trainParam.epochs=100; % 最⼤迭代次数net.trainParam.lr=0.01; % 步长net.trainParam.goal=1e-5; % 迭代终⽌条件% net.divideFcn = '';%⽹络训练net=train(net,inputn,outputn);W1=net.iw{1, 1};b1=net.b{1};W2=net.lw{2, 1};b2=net.b{2};fun1=yers{1}.transferFcn;fun2=yers{2}.transferFcn;%% BP⽹络预测%预测数据归⼀化inputn_test=mapminmax('apply',input_test,inputps);%⽹络预测输出an=sim(net,inputn_test);%⽹络输出反归⼀化BPoutput=mapminmax('reverse',an,outputps);%% 结果分析figure(1)plot(BPoutput,'-.or')hold onplot(output_test,'-*b');legend('预测输出','期望输出')xlim([1 (Num-kk)]);title('BP⽹络预测输出','fontsize',12)ylabel('函数输出','fontsize',12)xlabel('样本','fontsize',12)saveas(gcf,sprintf('BP⽹络预测输出.jpg'),'bmp');%预测误差error=BPoutput-output_test;errorsum=sum(mse(error));% 保留参数save BP_parameter W1 b1 W2 b2 fun1 fun2 net inputps outputpsdemo.mclear;clc;close alldata_load=dlmread('housing.data');NodeNum=20;ratio=0.95;errorsum=BP_kailugaji(data_load, NodeNum, ratio);fprintf('测试集总体均⽅误差为:%f\n', errorsum);%%% 验证原来的或者预测新的数据num=1; % 验证第num⾏数据load('BP_parameter.mat');data=data_load(:, 1:end-1);real_label=data_load(:, end);X=data(num, :);X=X';Y=real_label(num, :);%% BP⽹络预测%预测数据归⼀化X=mapminmax('apply',X,inputps);%⽹络预测输出Y_pre=sim(net,X);%⽹络输出反归⼀化Y_pre=mapminmax('reverse',Y_pre,outputps);error=Y_pre-Y';errorsum=sum(mse(error));fprintf('第%d⾏数据的均⽅误差为:%f\n', num, errorsum);结果测试集总体均⽅误差为:5.184424第1⾏数据的均⽅误差为:3.258243注意:隐层节点个数,激活函数,迭代终⽌条件等等参数需要根据具体数据进⾏调整。
BP神经网络用于函数拟合与模式识别的Matlab示例程序clcclearclose all%---------------------------------------------------% 产生训练样本与测试样本,每一列为一个样本P1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];T1 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];P2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];T2 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];%---------------------------------------------------% 归一化[PN1,minp,maxp] = premnmx(P1);PN2 = tramnmx(P2,minp,maxp);%---------------------------------------------------% 设置网络参数NodeNum = 10; % 隐层节点数TypeNum = 3; % 输出维数TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值)%TF1 = 'tansig';TF2 = 'logsig';%TF1 = 'logsig';TF2 = 'purelin';%TF1 = 'tansig';TF2 = 'tansig';%TF1 = 'logsig';TF2 = 'logsig';%TF1 = 'purelin';TF2 = 'purelin';net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});%---------------------------------------------------% 指定训练参数% net.trainFcn = 'traingd'; % 梯度下降算法% net.trainFcn = 'traingdm'; % 动量梯度下降算法%% net.trainFcn = 'traingda'; % 变学习率梯度下降算法% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法%% (大型网络的首选算法 - 模式识别)% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小%% 共轭梯度算法% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves 修正算法略大% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大% (大型网络的首选算法 - 函数拟合,模式识别)% net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多%% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS 算法小,比共轭梯度算法略大%% (中小型网络的首选算法 - 函数拟合,模式识别)net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快%% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法%% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' %---------------------%net.trainParam.show = 1; % 训练显示间隔net.trainParam.lr = 0.3; % 学习步长 - traingd,traingdmnet.trainParam.mc = 0.95; % 动量项系数 - traingdm,traingdxnet.trainParam.mem_reduc = 10; % 分块计算Hessian矩阵(仅对Levenberg-Marquardt 算法有效)net.trainParam.epochs = 1000; % 最大训练次数net.trainParam.goal = 1e-8; % 最小均方误差net.trainParam.min_grad = 1e-20; % 最小梯度net.trainParam.time = inf; % 最大训练时间%---------------------------------------------------% 训练与测试net = train(net,PN1,T1); % 训练%---------------------------------------------------% 测试Y1 = sim(net,PN1); % 训练样本实际输出Y2 = sim(net,PN2); % 测试样本实际输出Y1 = full(compet(Y1)); % 竞争输出Y2 = full(compet(Y2));%---------------------------------------------------% 结果统计Result = ~sum(abs(T1-Y1)) % 正确分类显示为1Percent1 = sum(Result)/length(Result) % 训练样本正确分类率Result = ~sum(abs(T2-Y2)) % 正确分类显示为1Percent2 = sum(Result)/length(Result) % 测试样本正确分类率******************************************************************% BP 神经网络用于函数拟合% 使用平台 - Matlab6.5% 作者:陆振波,海军工程大学% 欢迎同行来信交流与合作,更多文章与程序下载请访问我的个人主页% 电子邮件:luzhenbo@% 个人主页:clcclearclose all%---------------------------------------------------% 产生训练样本与测试样本P1 = 1:2:200; % 训练样本,每一列为一个样本T1 = sin(P1*0.1); % 训练目标P2 = 2:2:200; % 测试样本,每一列为一个样本T2 = sin(P2*0.1); % 测试目标%---------------------------------------------------% 归一化[PN1,minp,maxp,TN1,mint,maxt] = premnmx(P1,T1);PN2 = tramnmx(P2,minp,maxp);TN2 = tramnmx(T2,mint,maxt);%---------------------------------------------------% 设置网络参数NodeNum = 20; % 隐层节点数TypeNum = 1; % 输出维数TF1 = 'tansig';TF2 = 'purelin'; % 判别函数(缺省值)%TF1 = 'tansig';TF2 = 'logsig';%TF1 = 'logsig';TF2 = 'purelin';%TF1 = 'tansig';TF2 = 'tansig';%TF1 = 'logsig';TF2 = 'logsig';%TF1 = 'purelin';TF2 = 'purelin';net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});%---------------------------------------------------% 指定训练参数% net.trainFcn = 'traingd'; % 梯度下降算法% net.trainFcn = 'traingdm'; % 动量梯度下降算法%% net.trainFcn = 'traingda'; % 变学习率梯度下降算法% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法%% (大型网络的首选算法)% net.trainFcn = 'trainrp'; % RPROP(弹性BP)算法,内存需求最小%% 共轭梯度算法% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正算法% net.trainFcn = 'traincgp'; % Polak-Ribiere修正算法,内存需求比Fletcher-Reeves 修正算法略大% net.trainFcn = 'traincgb'; % Powell-Beal复位算法,内存需求比Polak-Ribiere修正算法略大% (大型网络的首选算法)%net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient算法,内存需求与Fletcher-Reeves修正算法相同,计算量比上面三种算法都小很多%% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比BFGS 算法小,比共轭梯度算法略大%% (中型网络的首选算法)net.trainFcn = 'trainlm'; % Levenberg-Marquardt算法,内存需求最大,收敛速度最快%% net.trainFcn = 'trainbr'; % 贝叶斯正则化算法%% 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' %---------------------%net.trainParam.show = 20; % 训练显示间隔net.trainParam.lr = 0.3; % 学习步长 - traingd,traingdmnet.trainParam.mc = 0.95; % 动量项系数 - traingdm,traingdxnet.trainParam.mem_reduc = 1; % 分块计算Hessian矩阵(仅对Levenberg-Marquardt算法有效)net.trainParam.epochs = 1000; % 最大训练次数net.trainParam.goal = 1e-8; % 最小均方误差net.trainParam.min_grad = 1e-20; % 最小梯度net.trainParam.time = inf; % 最大训练时间%---------------------------------------------------% 训练net = train(net,PN1,TN1); % 训练%---------------------------------------------------% 测试YN1 = sim(net,PN1); % 训练样本实际输出YN2 = sim(net,PN2); % 测试样本实际输出MSE1 = mean((TN1-YN1).^2) % 训练均方误差MSE2 = mean((TN2-YN2).^2) % 测试均方误差%---------------------------------------------------% 反归一化Y2 = postmnmx(YN2,mint,maxt);%---------------------------------------------------% 结果作图plot(1:length(T2),T2,'r+:',1:length(Y2),Y2,'bo:')title('+为真实值,o为预测值')%输入样本点及其相应的类别,其中有一个奇异点P=[-0.5 -0.5 0.3 -0.1 0.2 0.0 0.6 0.8 60;-0.5 0.5 -0.5 1.0 0.5 -0.9 0.8 -0.6 20];T=[1 1 0 1 1 0 1 0 1];%在坐标图上绘出样本点plotpv(P,T);%建立一个感知器网络figure;plotpv(P,T);net=newp([-1 60;1 20],1);handle=plotpc(net.iw{1},net.b{1});%利用样本点训练网络并绘出得到的分类线E=1;while (sse(E)),[net,Y,E]=adapt(net,P,T);handle=plotpc(net.iw{1},net.b{1},handle);end;%局部放大分类线图figure;plotpv(P,T);plotpc(net.iw{1},net.b{1});axis([-2 2 -2 2]);%选择10个点来测试网络testpoints=[-0.5 0.3 -0.9 0.4 -0.1 0.2 -0.6 0.8 0.1 -0.4; -0.3 -0.8 -0.4 -0.7 0.4 -0.6 0.1 -0.5 -0.5 0.3]; a=sim(net,testpoints);%在坐标图上绘出网络的分类结果及分类线figure;plotpv(testpoints,a);plotpc(net.iw{1},net.b{1});%产生指定类别的样本点,并在图中绘出X = [0 1; 0 1]; % 限制类中心的范围clusters = 5; % 指定类别数目points = 10; % 指定每一类的点的数目std_dev = 0.05; % 每一类的标准差P = nngenc(X,clusters,points,std_dev);plot(P(1,:),P(2,:),'+r');title('输入样本向量');xlabel('p(1)');ylabel('p(2)');%建立网络net=newc([0 1;0 1],5,0.1); %设置神经元数目为5 %得到网络权值,并在图上绘出figure;plot(P(1,:),P(2,:),'+r');w=net.iw{1}hold on;plot(w(:,1),w(:,2),'ob');hold off;title('输入样本向量及初始权值');xlabel('p(1)');ylabel('p(2)');figure;plot(P(1,:),P(2,:),'+r');hold on;%训练网络net.trainParam.epochs=7;net=init(net);net=train(net,P);%得到训练后的网络权值,并在图上绘出w=net.iw{1}plot(w(:,1),w(:,2),'ob');hold off;title('输入样本向量及更新后的权值');xlabel('p(1)');ylabel('p(2)');a=0;p = [0.6 ;0.8];a=sim(net,p)%生成一个信号,作为被预测信号Time=0:0.025:5;T=sin(Time*4*pi);Q=length(T);%由信号T生成输入信号PP = zeros(5,Q);P(1,2:Q) = T(1,1:(Q-1));P(2,3:Q) = T(1,1:(Q-2));P(3,4:Q) = T(1,1:(Q-3));P(4,5:Q) = T(1,1:(Q-4));P(5,6:Q) = T(1,1:(Q-5));%绘出信号T的曲线figure;plot(Time,T);title('信号T');xlabel('时间');ylabel('目标信号');%设计网络net=newlind(P,T);%仿真网络a=sim(net,P);%绘出网络预测输出figure;plot(Time,a);title('预测结果');xlabel('时间');ylabel('预测值');%得到误差信号,并绘出其曲线e=T-a;figure;plot(Time,e);title('误差');xlabel('时间');ylabel('误差值');%分别定义两段时间Time1和Time2,对应信号的不同频率时段Time1=0:0.05:4;Time2=4.05:0.024:6;Time=[Time1 Time2];%得到待预测的目标信号T=[cos(Time1*4*pi) cos(Time2*8*pi)];T=con2seq(T);%绘出目标信号的曲线,并指定给输入figure;plot(Time,cat(2,T{:}));xlabel('时间');ylabel('目标');title('待跟踪的目标信号');P=T;%生成线性网络lr=0.1;delays = [1 2 3 4 5];net = newlin(minmax(cat(2,P{:})),1,delays,lr);%对网络进行自适应训练[net,a,e]=adapt(net,P,T);%绘出预测信号、目标信号及误差信号曲线figure;plot(Time,cat(2,a{:}),Time,cat(2,P{:}),'--');xlabel('时间');ylabel('目标、预测值');title('目标信号及预测结果');figure;plot(Time,cat(2,e{:}));xlabel('时间');ylabel('误差');title('误差信号');%定义输入信号并绘出其曲线time=0:0.025:5;X=sin(sin(time).*time*10);plot(time,X);title('输入信号T');xlabel('时间');ylabel('输入信号');figure;%定义系统线性变换函数,绘出系统输出曲线T=X*2+0.8;plot(time,T);title('系统输出T');xlabel('时间');ylabel('系统输出');%定义网络输入Q=size(X,2);P=zeros(3,Q);P(1,1:Q)=X(1,1:Q);P(2,2:Q)=X(1,1:(Q-1));P(3,3:Q)=X(1,1:(Q-2));%建立网络net=newlind(P,T);%测试网络a=sim(net,P);%绘出网络输出a与系统输出Tfigure;plot(time,a,'+',time,T,'--');title('网络输出a与系统输出T'); xlabel('时间');ylabel('系统输出-- 网络输出+');%计算误差,并绘出其曲线e=T-a;figure;plot(time,e);title('输出误差');xlabel('时间');ylabel('误差');%定义输入信号并绘出其曲线time1=0:0.005:4;time2=4.005:0.005:6;time=[time1 time2];X=sin(sin(time*4).*time*8);plot(time,X);title('输入信号X');xlabel('时间');ylabel('输入信号');%定义系统输出,绘出曲线steps1=length(time1);[T1,state]=filter([1 -0.5],1,X(1:steps1));steps2=length(time2);T2=filter([0.9 -0.6],1,X((1:steps2) + steps1),state); T=[T1 T2];figure;plot(time,T);title('系统输出T');xlabel('时间');ylabel('系统输出');%将系统输入和输出转换成序列信号T=con2seq(T);P=con2seq(X);%建立网络lr=0.5;delays=[0 1];net=newlin(minmax(cat(2,P{:})),1,delays,lr);%训练网络[net,a,e]=adapt(net,P,T);%绘出网络输出a与系统输出Tfigure;plot(time,cat(2,a{:}),'+',time,cat(2,T{:}),'--');title('网络输出a与系统输出T');xlabel('时间');ylabel('系统输出-- 网络输出+');%绘出误差曲线figure;plot(time,cat(2,e{:}));title('输出误差');xlabel('时间');ylabel('误差');。
BP神经网络数据分类——语音信号特征分类MatLab程序代码%% 清空环境变量clcclear%% 训练数据预测数据提取及归一化%下载四类语音信号load data1c1load data2c2load data3c3load data4c4%四个特征信号矩阵合成一个矩阵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_trai n);%% 网络结构初始化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_te st,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。
BPNN在matlab中的实现学习运用Matlab创建BP神经网络(R2022b)BP神经网络属于前向网络以下为创建BP神经网络的方法及参数意义(1)net=newff(P,T,S)或者net=newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)P:输入参数矩阵。
(R某Q1)T:目标参数矩阵。
(SN某Q2)S:N-1个隐含层的数目(S(i)到S(N-1)),输出层的单元数目取决于T,默认为空矩阵。
TF:相关层的传递函数,默认隐含层为tanig函数,输出层为purelin函数。
BTF:BP神经网络学习训练函数,默认值为trainlm函数。
BLF:权重学习函数,默认值为learngdm。
PF:性能函数,默认值为me。
IPF,OPF,DDF均为默认值即可。
(2)传递函数purelin线性传递函数tanig正切S型传递函数logig对数S型传递函数隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点转移函数选用tanig函数或logig函数,输出层节点转移函数选用tanig函数或purelin函数。
(3)学习训练函数神经网络的学习分为有导师学习和无导师学习。
最速下降BP算法:traingd动量BP算法:traingdm学习率可变的BP算法:trainda(学习率可变的最速下降BP算法);traind某(学习率可变的动量BP算法)弹性算法:trainrp变梯度算法:traincgf(Fletcher-Reeve修正算法)traincgp(Polak_Ribiere修正算法)traincgb(Powell-Beale复位算法)trainbfg(BFGS拟牛顿算法)traino(OSS算法)trainlm(LM算法)参数说明:通过net.trainParam可以查看参数ShowTrainingWindowFeedbackhowWindow:trueMinimumGradientmin_grad:性能函数最小梯度Ma某imumValidationCheckma某_fail:最大验证失败次数LearningRatelr:学习速率LearningRateIncreaelr_inc:学习速率增长值LearningRatelr_dec:学习速率下降值Ma某imumPerformanceIncreaema某_perf_inc:MomentumContantmc:动量因子(4)BP神经网络预测函数SimOut=im('model',Parameter)&y=im(net,某)函数功能:用训练好的BP神经网络预测函数输出net:训练好的网络某:输入数据y:网络预测数据(5)训练函数[net,tr]=train(Net,P,T,Pi,Ai)其中,Net待训练的网络P输入数据矩阵T输出数据矩阵(default=zero)Pi初始化输入层条件(default=zero)Ai初始化输出层条件(default=zero)net训练好的网络tr训练过程记录注意:PNi-by-TScellarrayEachelementP{i,j,t}ianNi-by-Qmatri 某.TNl-by-TScellarrayEachelementT{i,t}iaUi-by-Qmatri某.现给出一药品商店一年当中12个月的药品销售量(单位:箱)如下:205623952600229816341600187314871900150020461556训练一个BP网络,用当前的所有数据预测下一个月的药品销售量。
神经网络的设计实例(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网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。
以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。
程序一:GA训练BP权值的主函数function net=GABPNET(XX,YY)%--------------------------------------------------------------------------% GABPNET.m% 使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络%--------------------------------------------------------------------------%数据归一化预处理nntwarn offXX=[1:19;2:20;3:21;4:22]';YY=[1:4];XX=premnmx(XX);YY=premnmx(YY);YY%创建网络net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'tra inlm');%下面使用遗传算法对网络进行优化P=XX;T=YY;R=size(P,1);S2=size(T,1);S1=25;%隐含层节点数S=R*S1+S1*S2+S1+S2;%遗传算法编码长度aa=ones(S,1)*[-1,1];popu=50;%种群规模save data2 XX YY % 是将 xx,yy 二个变数的数值存入 data2 这个MAT-file,initPpp=initializega(popu,aa,'gabpEval');%初始化种群gen=100;%遗传代数%下面调用gaot工具箱,其中目标函数定义为gabpEval[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 11],'maxGenTerm',gen,...'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);%绘收敛曲线图figure(1)plot(trace(:,1),1./trace(:,3),'r-');hold onplot(trace(:,1),1./trace(:,2),'b-');xlabel('Generation');ylabel('Sum-Squared Error');figure(2)plot(trace(:,1),trace(:,3),'r-');hold onplot(trace(:,1),trace(:,2),'b-');xlabel('Generation');ylabel('Fittness');%下面将初步得到的权值矩阵赋给尚未开始训练的BP网络[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);net.LW{2,1}=W1;net.LW{3,2}=W2;net.b{2,1}=B1;net.b{3,1}=B2;XX=P;YY=T;%设置训练参数net.trainParam.show=1;net.trainParam.lr=1;net.trainParam.epochs=50;net.trainParam.goal=0.001;%训练网络net=train(net,XX,YY);程序二:适应值函数function [sol, val] = gabpEval(sol,options)% val - the fittness of this individual% sol - the individual, returned to allow for Lamarckian evolution % options - [current_generation]load data2nntwarn offXX=premnmx(XX);YY=premnmx(YY);P=XX;T=YY;R=size(P,1);S2=size(T,1);S1=25;%隐含层节点数S=R*S1+S1*S2+S1+S2;%遗传算法编码长度for i=1:S,x(i)=sol(i);end;[W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);程序三:编解码函数function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x)load data2nntwarn offXX=premnmx(XX);YY=premnmx(YY);P=XX;T=YY;R=size(P,1);S2=size(T,1);S1=25;%隐含层节点数S=R*S1+S1*S2+S1+S2;%遗传算法编码长度% 前R*S1个编码为W1for i=1:S1,for k=1:R,W1(i,k)=x(R*(i-1)+k);endend% 接着的S1*S2个编码(即第R*S1个后的编码)为W2for i=1:S2,for k=1:S1,W2(i,k)=x(S1*(i-1)+k+R*S1);endend% 接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1for i=1:S1,B1(i,1)=x((R*S1+S1*S2)+i);end% 接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2for i=1:S2,B2(i,1)=x((R*S1+S1*S2+S1)+i);end% 计算S1与S2层的输出A1=tansig(W1*P,B1);A2=purelin(W2*A1,B2);% 计算误差平方和SE=sumsqr(T-A2);val=1/SE; % 遗传算法的适应值想运行程序,直接在代码窗口输入GABPNET即可。
图1. 人工神经元模型图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值( threshold ),或称为偏置( bias )。
则神经元i的输出与输入的关系表示为:图中yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数( Transfer Function ) ,net称为净激活(net activation)。
若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为:若用X表示输入向量,用W表示权重向量,即:X = [ x0 , x1 , x2 , ....... , xn ]则神经元的输出可以表示为向量相乘的形式:若神经元的净激活net为正,称该神经元处于激活状态或兴奋状态(fire),若净激活net为负,则称神经元处于抑制状态。
图1中的这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )。
2. 常用激活函数激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。
(1) 线性函数( Liner Function )(2) 斜面函数( Ramp Function )(3) 阈值函数( Threshold Function )以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。
(4) S形函数( Sigmoid Function )该函数的导函数:(5) 双极S形函数该函数的导函数:S形函数与双极S形函数的图像如下:图3. S形函数与双极S形函数图像双极S形函数与S形函数主要区别在于函数的值域,双极S形函数值域是(-1,1),而S形函数值域是(0,1)。
由于S形函数与双极S形函数都是可导的(导函数是连续函数),因此适合用在BP神经网络中。
(BP算法要求激活函数可导)3. 神经网络模型神经网络是由大量的神经元互联而构成的网络。
根据网络中神经元的互联方式,常见网络结构主要可以分为下面3类:(1) 前馈神经网络(Feedforward Neural Networks )前馈网络也称前向网络。
这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出层,层间没有向后的反馈信号,因此被称为前馈网络。
感知机( perceptron)与BP神经网络就属于前馈网络。
图4 中是一个3层的前馈神经网络,其中第一层是输入单元,第二层称为隐含层,第三层称为输出层(输入单元不是神经元,因此图中有2层神经元)。
图4. 前馈神经网络对于一个3层的前馈神经网络N,若用X表示网络的输入向量,W1~W3表示网络各层的连接权向量,F1~F3表示神经网络3层的激活函数。
那么神经网络的第一层神经元的输出为:O1 = F1( XW1 )第二层的输出为:O2 = F2 ( F1( XW1 ) W2 )输出层的输出为:O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )若激活函数F1~F3都选用线性函数,那么神经网络的输出O3将是输入X 的线性函数。
因此,若要做高次函数的逼近就应该选用适当的非线性函数作为激活函数。
(2) 反馈神经网络(Feedback Neural Networks )反馈型神经网络是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。
典型的反馈型神经网络有:Elman网络和Hopfield网络。
图5. 反馈神经网络(3) 自组织网络( SOM ,Self-Organizing Neural Networks )自组织神经网络是一种无导师学习网络。
它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。
图6. 自组织网络4. 神经网络工作方式神经网络运作过程分为学习和工作两种状态。
(1)神经网络的学习状态网络的学习主要是指使用学习算法来调整神经元间的联接权,使得网络输出更符合实际。
学习算法分为有导师学习( Supervised Learning )与无导师学习( Unsupervised Learning )两类。
有导师学习算法将一组训练集( training set )送入网络,根据网络的实际输出与期望输出间的差别来调整连接权。
有导师学习算法的主要步骤包括:1)从样本集合中取一个样本(Ai,Bi);2)计算网络的实际输出O;3)求D=Bi-O;4)根据D调整权矩阵W;5)对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围。
BP算法就是一种出色的有导师学习算法。
无导师学习抽取样本集合中蕴含的统计特性,并以神经元之间的联接权的形式存于网络中。
Hebb学习律是一种经典的无导师学习算法。
(2) 神经网络的工作状态神经元间的连接权不变,神经网络作为分类器、预测器等使用。
下面简要介绍一下Hebb学习率与Delta学习规则。
(3) 无导师学习算法:Hebb学习率Hebb算法核心思想是,当两个神经元同时处于激发状态时两者间的连接权会被加强,否则被减弱。
为了理解Hebb算法,有必要简单介绍一下条件反射实验。
巴甫洛夫的条件反射实验:每次给狗喂食前都先响铃,时间一长,狗就会将铃声和食物联系起来。
以后如果响铃但是不给食物,狗也会流口水。
图7. 巴甫洛夫的条件反射实验受该实验的启发,Hebb的理论认为在同一时间被激发的神经元间的联系会被强化。
比如,铃声响时一个神经元被激发,在同一时间食物的出现会激发附近的另一个神经元,那么这两个神经元间的联系就会强化,从而记住这两个事物之间存在着联系。
相反,如果两个神经元总是不能同步激发,那么它们间的联系将会越来越弱。
Hebb学习律可表示为:其中wij表示神经元j到神经元i的连接权,yi与yj为两个神经元的输出,a 是表示学习速度的常数。
若yi与yj同时被激活,即yi与yj同时为正,那么Wij 将增大。
若yi被激活,而yj处于抑制状态,即yi为正yj为负,那么Wij将变小。
(4) 有导师学习算法:Delta学习规则Delta学习规则是一种简单的有导师学习算法,该算法根据神经元的实际输出与期望输出差别来调整连接权,其数学表示如下:其中Wij表示神经元j到神经元i的连接权,di是神经元i的期望输出,yi是神经元i的实际输出,xj表示神经元j状态,若神经元j处于激活态则xj为1,若处于抑制状态则xj为0或-1(根据激活函数而定)。
a是表示学习速度的常数。
假设xi为1,若di比yi大,那么Wij将增大,若di比yi小,那么Wij将变小。
Delta规则简单讲来就是:若神经元实际输出比期望输出大,则减小所有输入为正的连接的权重,增大所有输入为负的连接的权重。
反之,若神经元实际输出比期望输出小,则增大所有输入为正的连接的权重,减小所有输入为负的连接的权重。
这个增大或减小的幅度就根据上面的式子来计算。
(5)有导师学习算法:BP算法采用BP学习算法的前馈型神经网络通常被称为BP网络。
图8. 三层BP神经网络结构BP网络具有很强的非线性映射能力,一个3层BP神经网络能够实现对任意非线性函数进行逼近(根据Kolrnogorov定理)。
一个典型的3层BP神经网络模型如图7所示。
BP网络的学习算法占篇幅较大,我打算在下一篇文章中介绍。
第二节、神经网络实现1. 数据预处理在训练神经网络前一般需要对数据进行预处理,一种重要的预处理手段是归一化处理。
下面简要介绍归一化处理的原理与方法。
(1) 什么是归一化?数据归一化,就是将数据映射到[0,1]或[-1,1]区间或更小的区间,比如(0.1,0.9) 。
(2) 为什么要归一化处理?<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。
(3) 归一化算法一种简单而快速的归一化算法是线性转换算法。
线性转换算法常见有两种形式:<1>y = ( x - min )/( max - min )其中min为x的最小值,max为x的最大值,输入向量为x,归一化后的输出向量为y 。
上式将数据归一化到[ 0 , 1 ]区间,当激活函数采用S形函数时(值域为(0,1))时这条式子适用。
<2>y = 2 * ( x - min ) / ( max - min ) - 1这条公式将数据归一化到[ -1 , 1 ] 区间。
当激活函数采用双极S形函数(值域为(-1,1))时这条式子适用。
(4) Matlab数据归一化处理函数Matlab中归一化处理数据可以采用premnmx ,postmnmx ,tramnmx 这3个函数。
<1> premnmx语法:[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t)参数:pn:p矩阵按行归一化后的矩阵minp,maxp:p矩阵每一行的最小值,最大值tn:t矩阵按行归一化后的矩阵mint,maxt:t矩阵每一行的最小值,最大值作用:将矩阵p,t归一化到[-1,1] ,主要用于归一化处理训练数据集。
<2> tramnmx语法:[pn] = tramnmx(p,minp,maxp)参数:minp,maxp:premnmx函数计算的矩阵的最小,最大值pn:归一化后的矩阵作用:主要用于归一化处理待分类的输入数据。
<3> postmnmx语法:[p,t] = postmnmx(pn,minp,maxp,tn,mint,maxt)参数:minp,maxp:premnmx函数计算的p矩阵每行的最小值,最大值mint,maxt:premnmx函数计算的t矩阵每行的最小值,最大值作用:将矩阵pn,tn映射回归一化处理前的范围。
postmnmx函数主要用于将神经网络的输出结果映射回归一化前的数据范围。
2. 使用Matlab实现神经网络使用Matlab建立前馈神经网络主要会使用到下面3个函数:newff :前馈网络创建函数train:训练一个神经网络sim :使用网络进行仿真下面简要介绍这3个函数的用法。