Matlab BPNet逼近函数
1-6-1结构
function BPNet
%% 参数初始化
l = 0.09; % 学习率
n = 20; % 样本数
cells1 = 6; % 神经元个数
cells2 = 2;
times = 500; % 训练轮数
x = (linspace(0,2*pi*19/20,20)); % 选取样本点
t = 0.5*(1+cos(x)); % 样本需要学习的函数
w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [6 ,1]
w2 = rand(1,cells1); % 随机赋值第二层连接权系数 [1, 6]
% w3=rand(1,cells2);
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值
yw2 = rand(1,1); % 随机赋值第二层输出阈值
% yw3=rand;
y = rand(1,n); % 随机赋值输出
counts = 1; % 计数值初始化
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
ei=0;
for a=1:n % 样本数
net1=w1*x(a)-yw1; % 第一层网络的输入 [6, 1]
out1=logsig(net1); % 第一层网路的输出 [6, 1]
y(a)=w2*out1-yw2; % 第二层网络的输入 [1, 6]*[6 ,1]=[1]
% out3=logsig(net2); % 第二层网络的输出 [1]
% net3=w3*out2-yw3;
% y(a)=net3;
det2=t(a)-y(a); % 计算偏差 [1]
det1=((det2*(w2))'.*out1).*(1-out1); %%2*1 ([6, 1]'*[6 ,1])*[6, 1] = [6, 1]
% det1=((det2'*(w2))'.*out1).*(1-out1);%%4*1
w1=w1+det1*x(a)*l; % [6, 1]
w2=w2+(det2*out1')*l; % [1, 6]
% w3=w3+(det3*out2')*l;
yw1=-det1*l+yw1;
yw2=-det2*l+yw2;
% yw3=-det3*l+yw3;
ei=ei+det2^2/2;
e(i)=ei;
end % 结束一次样本遍历
if ei<0.008
break;
end
counts=counts+1;
end % 结束学习
%% 计算学习的曲线
for a=1:n
net1=w1*x(a)-yw1;
out1=logsig(net1);
net2=w2*out1-yw2;
% out2=logsig(net2);
% net3=w3*out2-yw3;
y(a)=net2;
end
%% 绘图
subplot(2,1,1);
plot(x,t,'b-',x,y,'ro-');
grid on
title('BP学习方法逼近y=0.5*(1+cos(x))');
xlabel('x轴');
ylabel('y=0.5*(1+cos(x))');
if (counts<times)
count=1:counts;
sum=counts;
else
count=1:times;
sum=times;
end
subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');
return;
1-4-2-1结构
function BPNet
%% 参数初始化
l = 0.09; % 学习率
n = 20; % 样本数
cells1 = 4; % 神经元个数
cells2 = 2;
times = 3000; % 训练轮数
x = (linspace(0,2*pi*19/20,20)); % 选取样本点
t = 0.5*(1+cos(x)); % 样本需要学习的函数
w1 = rand(cells1,1); % 随机赋值第一层连接权系数 [6 ,1] [4, 1]
w2 = rand(cells2,cells1); % 随机赋值第二层连接权系数 [1, 6] [2, 4]
w3=rand(1,cells2); % 随机赋值第三层连接权系数 [1, 2]
yw1 = rand(cells1,1); % 随机赋值第一层输出阈值 [6, 1] [4, 1]
yw2 = rand(cells2,1); % 随机赋值第二层输出阈值 [1] [2, 1]
yw3=rand; % 随机赋值第三层输出阈值 [1]
y = rand(1,n); % 随机赋值输出
counts = 1; % 计数值初始化
e=zeros(1,times); % 均方差初始值设为0
%% 学习过程
for i=1:times % 学习轮数
ei=0;
for a=1:n % 样本数
net1=w1*x(a)-yw1; % 第一层网络的输入 [6, 1] [4, 1]
out1=logsig(net1); % 第一层网路的输出 [6, 1] [4, 1]
net2=w2*out1-yw2; % 第二层网络的输入 [1, 6]*[6 ,1]=[1] [2, 1]
out2=logsig(net2); % 第二层网络的输出 [1] [2, 1]
net3=w3*out2-yw3; % 第三层网络的输出 [1]
y(a)=net3; % 第三层网络的输出 [1]
det3=t(a)-y(a); % 计算偏差 [1]
det2=((det3*(w3))'.*out2).*(1-out2); %%2*1 ([6, 1]'*[6 ,1])*[6, 1] = [6, 1] [2, 1]
det1=((det2'*(w2))'.*out1).*(1-out1);%%4*1 [4, 1]
w1=w1+det1*x(a)*l; % [6, 1] [4, 1]
w2=w2+(det2*out1')*l; % [1, 6] [2, 4]
w3=w3+(det3*out2')*l; % [1, 2]
yw1=-det1*l+yw1;
yw2=-det2*l+yw2;
yw3=-det3*l+yw3;
ei=ei+det3^2/2;
e(i)=ei;
end % 结束一次样本遍历
if ei<0.008
break;
end
counts=counts+1;
end % 结束学习
%% 计算学习的曲线
for a=1:n
net1=w1*x(a)-yw1;
out1=logsig(net1);
net2=w2*out1-yw2;
out2=logsig(net2);
net3=w3*out2-yw3;
y(a)=net3;
end
%% 绘图
subplot(2,1,1);
plot(x,t,'b-',x,y,'ro-');
grid on
title('BP学习方法逼近y=0.5*(1+cos(x))');
xlabel('x轴');
ylabel('y=0.5*(1+cos(x))');
if (counts<times)
count=1:counts;
sum=counts;
else
count=1:times;
sum=times;
end
subplot(2,1,2);
plot(count,e(1:sum));
grid on;
title('BP算法学习曲线');
xlabel('迭代次数');
ylabel('Mean-Square-Error');
return;
不同的写法(效果差不好)
%BP identification
clear all;
close all;
%% 变量初始化
xite=0.05;
alfa=0.005;
w1=rand(1,6); % k+1时刻权值
w1_1=w1; % k时刻权值
w1_2=w1_1; % k-1时刻权值
w2=rand(6,1); % k+1时刻权值
w2_1=w2; % k时刻权值
w2_2=w2_1; % k-1时刻权值
dw1=0*w1;
%% 模型学习
for times = 1:500
for k=1:1:20
time(k) = k;
x = 2*pi*(k-1)/20;
y(k) = 0.5*(1+cos(x));
I = x*w1; % 计算隐层的输入 [1, 6]
for j=1:1:6
Iout(j) =1/(1+exp(-I(j))); % 计算隐层的输出 sigmoid [1, 6]
end
yn(k) = Iout * w2; % Output of networks [1, 6]*[6, 1] = [1]
e(k) = y(k)-yn(k); % Error calculation
w2 = w2_1+(xite*e(k))*Iout'+alfa*(w2_1-w2_2); % 隐层和输出层之间的权重学习,并且为了避免学习中发生震荡等问题,加入了动量因子=0
for j=1:1:6
FI(j) = exp(-I(j))/(1+exp(-I(j)))^2; % xj‘(1-xj’) [1, 6]
end
for j=1:1:6
dw1(j)=e(k)*xite*FI(j)*w2(j)*x; % [1, 6]
end
w1 = w1_1+dw1+alfa*(w1_1-w1_2); % 隐层和输入层之间的权重学习,并且为了避免学习中发生震荡等问题,加入了动量因子=0
%%%%%%%%%%%%%%Jacobian%%%%%%%%%%%%%%%%计算输出对输出入的敏感度
yu=0;
for j=1:1:6
yu=yu+w2(j)*w1(j)*FI(j);
end
dyu(k)=yu;
w1_2=w1_1; % 更新权值
w1_1=w1;
w2_2=w2_1; % 更新权值
w2_1=w2;
end
end
%% 绘图
figure(1);
plot(time,y,'b-',time,yn,'ro-');
xlabel('times');
ylabel('y and yn');
figure(2);
plot(time,y-yn,'r');
xlabel('times');
ylabel('error');
figure(3);
plot(time,dyu);
xlabel('times');
ylabel('dyu');
跟上面的主要区别还是权重更新的方式不一样,所以导致的效果不同,具体细节没在研究!!!