matlab实现简单BP神经网络(不使用工具箱),两种求误差方式
2017-10-10 19:55
671 查看
BP网络实现y=1+x+x*x函数模拟,输入层一个节点,隐含层8个节点,输出层1个节点
将数据分为测试集合和训练集合两部分
%% BP算法模拟 y = 1 + x + x*x
%作者:msl 时间:2017-10-07
clc;
clear;
%% step0:定义
TrainCount = 1000;%最大训练次数为2000次
DataNum = 1001;%训练的数据有1001个
Hide_Out = zeros(1,8);%初始化隐含层输出
Hide_OutTest = zeros(1,8);
Rata_H = 0.2;%隐含层学习速率
Rata_O = 0.1;%输出层学习速率
%% step1:取数据
x = -5:0.01:6;%x的训练数据
y = 1 + x + x.*x;%y对应于x的数据
%% step2:训练数据归一化和初始化权值
x_Nor = (x -(-5) + 1)/(5 - (-5) + 1);%x归一化后得到的数据
y_Nor = (y - 0.75 + 1)/(31 - 0.75 + 1);%y归一化后得到的数据
w = 2*(rand(1,8)-0.5);%得到输入层到隐含层的8个权值初始化
v = 2*(rand(1,8)-0.5);%得到隐含层到输出层的8个权值初始化
dw = zeros(1,8);%隐含层权值调整量初始化 0
dv = zeros(1,8);%输出层权值调整量初始化 0
%% CH 建立训练集和测试集
xNum=length(x);
Itest=1:11:xNum;
Xtest_Nor=x_Nor(Itest);
Ytest_Nor=y_Nor(Itest);
Xtrain_Nor=x_Nor;
Ytrain_Nor=y_Nor;
Xtrain_Nor(Itest)=[];
Ytrain_Nor(Itest)=[];
%% step3:训练神经网络
Count = 0;%循环次数计数器
e2 = 0;
while(1)
%% 主体循环
for i = 1:1000
e1 = 0;
%% 前向传播
for j = 1:8
sum1 = w(j)*Xtrain_Nor(i);%隐含层输入
Hide_Out(j) = 1/(1 + exp(-1*sum1)); %隐含层输出
end
sum2 = 0;
for k = 1:8
sum2 = sum2 + v(k)*Hide_Out(k);%输出层输入
end
OutputData = sum2;%输出层输出
e1 = e1 + abs(OutputData - Ytrain_Nor(i));
%% 反向更新
for s = 1:8
alfa = 0;
alfa = alfa + (Ytrain_Nor(i) - OutputData) * v(s);
dv(s) = Rata_O * (Ytrain_Nor(i) - OutputData) * Hide_Out(s);%更新输出层权值
v(s) = v(s) + dv(s);
dw(s) = Rata_H * alfa * Hide_Out(s) * (1 - Hide_Out(s))*Xtrain_Nor(i);%更新隐含层权值
w(s) = v(s) + dw(s);
end
end
%%CH 计算训练集误差 START
e11 = e1 / 1000;%测试样本的平均误差
myErr1(Count+1)=e11;
%%CH 计算训练集误差 END
%% 计算测试集
%%% CH STRAT
e2=0;
%%% CH END
for p = 1:100
for l = 1:8
sum3 = w(l)* Xtest_Nor(p);%测试的隐含层输入
Hide_OutTest(l) = 1/(1 + exp(-1*sum3));%测试的隐含层输出
end
sum4 = 0;
for m = 1:8
sum4 = sum4 + v(m)*Hide_OutTest(m);%测试的输出层输入
end
4000
OutputData_Test = sum4;%输出层输出
e2 = e2 + abs(OutputData_Test - Ytest_Nor(p));
end
%%CH 计算测试集误差 STRAT
e12 = e2 / 100;%测试样本的平均误差
myErr2(Count+1)=e12;
%%CH 计算测试集误差 END
%%
Count = Count + 1;%训练次数
%% 作图
figure(1);
hold on
plot(Count,e11,'r',Count,e12,'b');
hold off
if(Count >TrainCount || e12 < 0.0001)%如果训练次数大于最大训练次数或者误差小于目标值,则退出训练
break;
end
end
%plot(myErr,'r');
%stop = 1;%进入测试
%% step4:测试神经网络(输入-5到5之间数据)
% while(stop)
% n = input('请输入数据n =\n');
% A = [];%存储测试结果
%
% fprintf('计算的结果为:%lf\n',A);
% stop = input('\n输入1继续测试,输入0退出测试 stop =\n ');
% end
% fprintf('程序运行结束\n');
第一种蓝色的误差曲线是将测试集合100个数据的输出值减去期望再除以100得到的
第二种是训练集合的全局误差 采用 e = e + | Output - y |(e为误差,Output为测试集输出,y为对应的期望输出)
将数据分为测试集合和训练集合两部分
%% BP算法模拟 y = 1 + x + x*x
%作者:msl 时间:2017-10-07
clc;
clear;
%% step0:定义
TrainCount = 1000;%最大训练次数为2000次
DataNum = 1001;%训练的数据有1001个
Hide_Out = zeros(1,8);%初始化隐含层输出
Hide_OutTest = zeros(1,8);
Rata_H = 0.2;%隐含层学习速率
Rata_O = 0.1;%输出层学习速率
%% step1:取数据
x = -5:0.01:6;%x的训练数据
y = 1 + x + x.*x;%y对应于x的数据
%% step2:训练数据归一化和初始化权值
x_Nor = (x -(-5) + 1)/(5 - (-5) + 1);%x归一化后得到的数据
y_Nor = (y - 0.75 + 1)/(31 - 0.75 + 1);%y归一化后得到的数据
w = 2*(rand(1,8)-0.5);%得到输入层到隐含层的8个权值初始化
v = 2*(rand(1,8)-0.5);%得到隐含层到输出层的8个权值初始化
dw = zeros(1,8);%隐含层权值调整量初始化 0
dv = zeros(1,8);%输出层权值调整量初始化 0
%% CH 建立训练集和测试集
xNum=length(x);
Itest=1:11:xNum;
Xtest_Nor=x_Nor(Itest);
Ytest_Nor=y_Nor(Itest);
Xtrain_Nor=x_Nor;
Ytrain_Nor=y_Nor;
Xtrain_Nor(Itest)=[];
Ytrain_Nor(Itest)=[];
%% step3:训练神经网络
Count = 0;%循环次数计数器
e2 = 0;
while(1)
%% 主体循环
for i = 1:1000
e1 = 0;
%% 前向传播
for j = 1:8
sum1 = w(j)*Xtrain_Nor(i);%隐含层输入
Hide_Out(j) = 1/(1 + exp(-1*sum1)); %隐含层输出
end
sum2 = 0;
for k = 1:8
sum2 = sum2 + v(k)*Hide_Out(k);%输出层输入
end
OutputData = sum2;%输出层输出
e1 = e1 + abs(OutputData - Ytrain_Nor(i));
%% 反向更新
for s = 1:8
alfa = 0;
alfa = alfa + (Ytrain_Nor(i) - OutputData) * v(s);
dv(s) = Rata_O * (Ytrain_Nor(i) - OutputData) * Hide_Out(s);%更新输出层权值
v(s) = v(s) + dv(s);
dw(s) = Rata_H * alfa * Hide_Out(s) * (1 - Hide_Out(s))*Xtrain_Nor(i);%更新隐含层权值
w(s) = v(s) + dw(s);
end
end
%%CH 计算训练集误差 START
e11 = e1 / 1000;%测试样本的平均误差
myErr1(Count+1)=e11;
%%CH 计算训练集误差 END
%% 计算测试集
%%% CH STRAT
e2=0;
%%% CH END
for p = 1:100
for l = 1:8
sum3 = w(l)* Xtest_Nor(p);%测试的隐含层输入
Hide_OutTest(l) = 1/(1 + exp(-1*sum3));%测试的隐含层输出
end
sum4 = 0;
for m = 1:8
sum4 = sum4 + v(m)*Hide_OutTest(m);%测试的输出层输入
end
4000
OutputData_Test = sum4;%输出层输出
e2 = e2 + abs(OutputData_Test - Ytest_Nor(p));
end
%%CH 计算测试集误差 STRAT
e12 = e2 / 100;%测试样本的平均误差
myErr2(Count+1)=e12;
%%CH 计算测试集误差 END
%%
Count = Count + 1;%训练次数
%% 作图
figure(1);
hold on
plot(Count,e11,'r',Count,e12,'b');
hold off
if(Count >TrainCount || e12 < 0.0001)%如果训练次数大于最大训练次数或者误差小于目标值,则退出训练
break;
end
end
%plot(myErr,'r');
%stop = 1;%进入测试
%% step4:测试神经网络(输入-5到5之间数据)
% while(stop)
% n = input('请输入数据n =\n');
% A = [];%存储测试结果
%
% fprintf('计算的结果为:%lf\n',A);
% stop = input('\n输入1继续测试,输入0退出测试 stop =\n ');
% end
% fprintf('程序运行结束\n');
第一种蓝色的误差曲线是将测试集合100个数据的输出值减去期望再除以100得到的
第二种是训练集合的全局误差 采用 e = e + | Output - y |(e为误差,Output为测试集输出,y为对应的期望输出)
相关文章推荐
- 声卡虚拟示波器简单功能-使用matlab DAQ工具箱中API实现
- 两种方法使用jquery实现左右移动效果(包含each遍历方式)
- MATLAB实现多分类和libsvm工具箱的安装使用详解
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 5,imshow绘图方式以及主辅图像缓存
- Java程序操作Oracle两种方式之简单实现
- 用两种方式实现简单的隔行变色 用js实现
- 使用PopupWindow和Activity两种不同的方式实现弹窗效果
- js实现文件下载的两种简单方式
- 用最简单最实用的方式实现ViewPager无限循环两种方式
- 两种简单的方式快速实现hashCode 和 equals方法
- C#使用命令行方式实现Ping简单功能
- 使用PopupWindow和Activity两种不同的方式实现弹窗效果
- matlab使用FULLBNT工具箱实现贝叶斯网络
- 使用ItemCreated事件和onmouseover两种方式 实现Repeater鼠标滑动效果
- 使用frame方式实现的简单注册框
- 使用被动套接字方式实现简单聊天室
- java使用soap方式简单实现webservice
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Java两种方式简单实现:爬取网页并且保存