一。概述
BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。在前向传递中,输入信号从输入层经隐含层处理,直至输出层。每一层的神经元状态只影响下一层神经元状态。如果输出层得不到期望输出,则转入反向传播,根据预测误差调整网络权值和阈值,从而使BP神经网络预测输出不断逼近期望输出。
二。BP神经网络的训练过程包含以下几个步骤:
步骤一:网络初始化。根据输入输出序列确定网络输入层节点数n,隐含层节点数l,输出层节点数m,初始化输入层,隐含层和输出层神经元之间的连接权值,初始化隐含层阈值,输出层阈值,给定学习速率和神经元激励函数。
步骤二:隐含层输出计算。根据输入向量X,输入层和隐含层间连接权值,以及隐含层阈值啊,计算隐含层输出H。
式中,l为隐含层节点数,f为隐含层激励函数,该函数有多种表达形式,本例所选函数为:。
步骤三:输出层输出计算。根据隐含层输出H,连接权值和阈值b,计算BP神经网络预测输出O.
步骤四:误差计算。根据网络预测输出O和期望输出Y,计算网络预测误差e。
步骤五:权值更新。根据网络预测误差e更新网络连接权值。
为学习速率。
步骤六:阈值更新。根据网络预测误差e更新网络节点阈值a,b.
步骤七:判断算法迭代是否结束,若没有结束,返回步骤二。
三。MATLAB实现
%清空环境变量
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,:);
%输入输出数据
input = data(:,2:25);
output1 = data(:,1);
%设定每组输入输出信号
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组数据作为预测数据
k = rand(1,2000);
[m,n] = sort(k);
input_train = input(n(1:1500),:)';
output_train = input(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);
for ii = 1:20
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(ads(e));
%计算w2.b2调整量
dw2 = e*Iout;
db2 = e';
%计算w1,b1调整量
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_1 = w1;
w2_1 = w2;
b1_1 = b1;
b2_1 = b2;
end
end
%BP神经网络分类
%输入数据归一化
inputn_test = mapminmax('apply',input_test,inputps);
%网络检测
for i = 1:5000
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
%类别统计
for i= 1;500
output_fore(i) = find(fore(:,i) == max(fore(:,i)));
end
%预测误差
error = output_fore - output1(n(1501,2000))';
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
%统计正确率
rightridio = (kk - k)./kk