基于Matlab的BP神经网络--源代码与工具箱实现
2014-03-03 21:28
405 查看
因为最近项目要使用BP神经网络来做一些飞行预测,所以今天从图书馆借来了《Matlab神经网络30个案例分析》,这本书很不错推荐给大家,然后研究了下代码,使用语音分类这个例子做了源码实现与工具箱实现,源码实现过程中进行了小小的改变,工具箱用起来非常方便,但是手写一下BP神经网络的前向后向对于理解BP神经网络还是有极大帮助的,这里把这两种实现方式贴出来并带有结果截图。显然BP神经网络对于这种非线性拟合场合效果是非常好的。
(1) 源码实现
%% 清空环境变量
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 = rands(1,2000);
[m,n] = sort(k);
%%提取输入、输出数据
input= data(:,2:25);
output1= data(:,1);
%将输出数据由一维变为四维
for i = 1: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(outnum,midnum);
b2 = rands(outnum,1);
w1_1 = w1;
b1_1 = b1;
w2_1 = w2;
b2_1 = b2;
xite = 0.1
%%网络训练
for ii=1:10
E(ii)=0;
for i = 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:innum
for j = 1:midnum
dw1(j,k) = FI(j)*x(k)*(w2(:,j)'*e);
db1(j) = FI(j)*(w2(:,j)'*e);
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;
b1_1 = b1;
w2_1 = w2;
b2_1 = b2;
end
end
%%语音信号分类
inputn_test = mapminmax('apply',input_test,inputps);
for i=1:1:500
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:1:500
output_fore(i) = find(fore(:,i) == max(fore(:,i)));
end
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: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
radio = (kk-k)./kk
(2) 工具箱实现
%清空环境变量
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);
k = rands(1,2000);
[m,n] = sort(k);
input_train = input(n(1:1500),:)';
output_train = output1(n(1:1500),:)';
input_test = input(n(1501:2000),:)';
output_test = output1(n(1501:2000),:)';
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
%BP神经网络构建
net = newff(inputn,outputn,25);
%网络参数配置
net.trainParam.epochs = 100;
net.trainParam.lr = 0.1;
net.trainParam.goal = 0.00004;
%BP神经网络训练
net = train(net,inputn,outputn);
%预测数据归一化
inputn_test = mapminmax('apply',input_test,inputps);
%BP神经网络预测输出
an = sim(net,inputn_test);
%输出结果反归一化
BPoutput = mapminmax('reverse',an,outputps);
%网络预测结果图形
figure(1)
plot(BPoutput,':og');
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error = BPoutput - output_test;
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')
errorsum = sum(abs(error))
(1) 源码实现
%% 清空环境变量
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 = rands(1,2000);
[m,n] = sort(k);
%%提取输入、输出数据
input= data(:,2:25);
output1= data(:,1);
%将输出数据由一维变为四维
for i = 1: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(outnum,midnum);
b2 = rands(outnum,1);
w1_1 = w1;
b1_1 = b1;
w2_1 = w2;
b2_1 = b2;
xite = 0.1
%%网络训练
for ii=1:10
E(ii)=0;
for i = 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:innum
for j = 1:midnum
dw1(j,k) = FI(j)*x(k)*(w2(:,j)'*e);
db1(j) = FI(j)*(w2(:,j)'*e);
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;
b1_1 = b1;
w2_1 = w2;
b2_1 = b2;
end
end
%%语音信号分类
inputn_test = mapminmax('apply',input_test,inputps);
for i=1:1:500
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:1:500
output_fore(i) = find(fore(:,i) == max(fore(:,i)));
end
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: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
radio = (kk-k)./kk
(2) 工具箱实现
%清空环境变量
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);
k = rands(1,2000);
[m,n] = sort(k);
input_train = input(n(1:1500),:)';
output_train = output1(n(1:1500),:)';
input_test = input(n(1501:2000),:)';
output_test = output1(n(1501:2000),:)';
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
%BP神经网络构建
net = newff(inputn,outputn,25);
%网络参数配置
net.trainParam.epochs = 100;
net.trainParam.lr = 0.1;
net.trainParam.goal = 0.00004;
%BP神经网络训练
net = train(net,inputn,outputn);
%预测数据归一化
inputn_test = mapminmax('apply',input_test,inputps);
%BP神经网络预测输出
an = sim(net,inputn_test);
%输出结果反归一化
BPoutput = mapminmax('reverse',an,outputps);
%网络预测结果图形
figure(1)
plot(BPoutput,':og');
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error = BPoutput - output_test;
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')
errorsum = sum(abs(error))
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- java和matlab画多边形闭合折线图示例讲解
- C#调用Matlab生成的dll方法的详细说明
- 从java中调用matlab详细介绍
- VC++与Matlab混合编程的快速实现
- Matlab 矩阵运算
- matlab与opencv部分函数的对照
- Matlab
- MATLAB 入门教程
- matlab函数_连通区域
- MATLAB中函数模式和命令模式的区别
- [转]matlab中plot用法
- matlab程序优化以及eclipse与github的结合
- matlab中的rand函数(用于产生随机数)
- MATLAB R2012a 安装到 Ubuntu 12.10
- 关于matlab图像处理
- c中启动和关闭matlab引擎遇到的问题
- C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab
- 高斯-勒让德求积公式
- DSP Builder