⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mybp_old.m

📁 我的人工神经网络作业
💻 M
字号:
clear
clc
close all
%数据输入
% input=[0.2576622 0.5001936 0.2277879 0.4703193 0.1979135 0.4404449 0.6829764 0.9255078 0.1680392 0.4105706 0.653102 0.8956335 0.1381649 0.3806963 0.6232277 0.8657591 0.1082906 0.350822 0.5933534 0.8358848];
% output=[0.3101366 0.2724358 0.2351537 0.8867011 0.1982851 0.841985 0.1618254 0.7978635 0.1257709 0.7543168];

DATA=textread('normalized.txt');
input=DATA(:,1:2);             %输入数据
output=DATA(:,3);              %期望输出数据

% %归一化处理
% I=(input-min(input))/(max(input)-min(input));
% O=(output-min(output))/(max(output)-min(output));

sample=5;                  %输入数据样本数
X=[input(1:sample,1)';input(1:sample,2)'];
T=[output(1:sample)'];


%提供两组训练集和目标值(2输入,1输出)
% X=[input(1) input(3) input(5) input(7) input(9) input(11) input(13) input(15) input(17) input(19);input(2) input(4) input(6) input(8) input(10) input(12) input(14) input(16) input(18) input(20)];
% T=[output(1) output(2) output(3) output(4) output(5) output(6) output(7) output(8) output(9) output(10)];

%BP网络的第一阶段学习期(训练加权系数wki,wij)
%初始化
lr=0.5;err_goal=0.005;     %lr为学习速率;err_goal为期望误差最小值
max_epoch=10000;          %max_epoch为训练的最大次数
Oi=0;Ok=0;                  %置隐含层和输出层各神经元输出初值为0

%初始化wki,wij(M为输入节点j的数量;Q为隐含层节点i的数量;L为输出节点k的数量)
[M,N]=size(X);Q=3;[L,N]=size(T); %N为训练集对数量
wij=rand(Q,M);
wki=rand(L,Q);    %用小的随机数初始化各层权值
 
for epoch=1:max_epoch
    %计算隐含层各神经元的输出
    NETi=wij*X;
    for j=1:N                 %分别对每个样本进行计算
        for i=1:Q             %分别对隐含层每个节点进行计算
            Oi(i,j)=1/(1+exp(-NETi(i,j)));            %计算隐含层第j个样本第i个节点的输出
        end
    end
    %计算输出层各神经元输出
    NETk=wki*Oi;
    for j=1:N
        for k=1:L             %分别对输出层每个节点进行计算
            Ok(k,j)=1/(1+exp(-NETk(k,j)));           %计算输出层第j个样本第k个节点的输出
        end
    end
    %计算误差函数
    e=((T-Ok).*(T-Ok))/2;
    E(epoch)=sum(e);
    if(E(epoch)<err_goal)break;end
%     E(epoch)=max(max(e));
%     if(E(epoch)<err_goal)break;end
    %调整输出层加权系数
    deltak=(T-Ok).*Ok.*(1-Ok);

    wki=wki+lr*deltak*Oi';

    %调整隐含层加权系数
    deltai=Oi.*(1-Oi).*(deltak'*wki)';

    wij=wij+lr*deltai*X';

end
epoch               %显示计算次数
T                   %显示训练时期望的输出
Ok                  %显示训练时计算的输出
figure(1)
plot(1:epoch,E);hold on;
plot([1:epoch],err_goal,'r');grid on;
axis([-inf inf -10*err_goal inf]);
title('训练误差曲线图');
xlabel('迭代次数');
ylabel('训练误差');

figure(2)
plot(1:N,T(1:N),'*-',1:N,Ok(1:N),'o:');grid on;
title('训练结果');
legend('训练数据','计算数据');
Absolut_error=sum(abs(Ok-T))/sample                    %计算训练时输出数据的绝对误差
Relative_error=sum((abs(Ok-T))./T)/sample              %计算训练时输出数据的相对误差
% e=((T-Ok).*(T-Ok))/2;
% aver_wucha=mean(e)



%BP网络的第二阶段工作期(根据训练好的wki,wij和给定的输入计算输出)
% X1=[0.07841624 0.5634791 0.04854191 0.5336047 0.01866759 0.5037304 0.4738561 0.4439818 0.9290446 0.4141074;0.3209476 0.8060105 0.2910733 0.7761362 0.261199 0.7462618 0.7163875 0.6865132 0.171576 0.6566389];               %给定输入
% T1=[0.09011834 0.7113269 0.05486553 0.6688765 0.02001054 0.6269497 0.5855314 0.5446081 0.8532748 0.5041668];

% %回想
% X2=X;
% T2=T;
% %计算隐含层各神经元输出
% NETi2=wij*X2;
% for j=1:N
%     for i=1:Q
%         Oi2(i,j)=1/(1+exp(-NETi2(i,j)));
%     end
% end
% %计算输出层各神经元的输出
% NETk2=wki*Oi2;
% for i=1:N
%     for k=1:L
%         Ok2(k,i)=1/(1+exp(-NETk2(k,i)));
%     end
% end
% % Ok                  %显示网络输出层的输出
% 
% Ok2                 %显示网络输出层的输出
% 
% figure(4)
% plot(1:N,T2(1:N),'*-',1:N,Ok2(1:N),'o:');grid on;
% title('回想结果');
% legend('训练数据','计算数据');


%泛化
X1=[input(sample+1:2*sample,1)';input(sample+1:2*sample,2)'];            %泛化输入数据
T1=[output(sample+1:2*sample,1)'];                                       %期望输出数据

%计算隐含层各神经元输出
NETi1=wij*X1;
for j=1:N
    for i=1:Q
        Oi1(i,j)=1/(1+exp(-NETi1(i,j)));
    end
end
%计算输出层各神经元的输出
NETk1=wki*Oi1;
for j=1:N
    for k=1:L
        Ok1(k,j)=1/(1+exp(-NETk1(k,j)));
    end
end

T1                  %显示泛化时期望的输出
Ok1                 %显示泛化时计算的输出

figure(3)
plot(1:N,T1(1:N),'*-',1:N,Ok1(1:N),'o:');grid on;
title('泛化结果');
legend('泛化数据','计算数据');

Absolut_error1=sum(abs(Ok1-T1))/sample                     %计算训练时输出数据的绝对误差
Relative_error1=sum((abs(Ok1-T1))./T1)/sample              %计算训练时输出数据的相对误差

% wucha1=((abs(Ok1-T1))./T1)/sample;
% aver_wucha1=mean(wucha1)
% e1=((T1-Ok1).*(T1-Ok1))/2;
% aver_wucha1=mean(e1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -