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

📄 bp_mlp1015.m

📁 模式识别的一个基础程序,手写数字模式识别,提供给大家分享
💻 M
字号:
function BP_MLP

clear;
clc;

sample_num=9;
test_num=361;
h_unitnum=4;
i_unitnum=1;
o_unitnum=1;

xmin = 0;
xmax = 2*pi;
p = xmin:(xmax-xmin)/(sample_num-1):xmax ;%i_unitnum*sample_num
t = sin(p);
%归一化
p1 = (p-min(p))/(max(p)-min(p));
t1 = (t-min(t))/(max(t)-min(t));

alpha=0.072;
eita = 0.04;
threshold = 0.01;

w_h = rand(h_unitnum,i_unitnum)+0.01;%h_unitnum*i_unitnum
w_o = rand(o_unitnum,h_unitnum)+0.01;%o_unitnum*h_unitnum
b_h = rand(h_unitnum,1);%h_unitnum*1
b_o = rand(o_unitnum,1);%o_unitnum*1
 
w_h_exp = [w_h (-1).*b_h];%h_unitnum*(i_unitnum+1)输入当隐层的权值扩展
w_o_exp = [w_o (-1).*b_o];%o_unitnum*(h_unitnum+1)隐层到输出的权值扩展
 
p_exp = [p1' ones(sample_num,1)]';% (i_unitnum+1)*sample_num采样输入扩展

error=[];
epoch = 1;
epochmax=20000;

delta_o1old = zeros(1,(h_unitnum+1));
delta_h1old = zeros(h_unitnum,(i_unitnum+1));

for i=1:epochmax
    epoch = epoch+1;
    
    h_out = logsig(w_h_exp*p_exp); %h_unitnum*sample_num隐层输出
    h_out_exp = [h_out' ones(sample_num,1)]';%(h_unitnum+1)*sample_num隐层输出扩展
    o_out = w_o_exp*h_out_exp;%o_unitnum*sample_num    
    et = t1-o_out;
    e = sumsqr(et);
    error = [error e];
    %判断
    if e<threshold
        break;
    end
    %反向计算误差
    %隐层到输出权值更新
    delta_o = et;
    delta_o1 = delta_o*h_out_exp';    
    w_o_exp = w_o_exp+alpha*((1-eita)*delta_o1+eita*delta_o1old);
    delta_o1old = delta_o1;
    %输入到隐层权值更新
    delta_h = w_o'*delta_o.*h_out.*(1-h_out);%h_unitnum*sample_num
    delta_h1 = delta_h*p_exp';%h_unitnum*(i_unitnum+1)
    w_h_exp = w_h_exp+alpha*((1-eita)*delta_h1+eita*delta_h1old); 
    delta_h1old = delta_h1;
end
%输出训练
figure(1);
plot(1:(epoch-1),error);
figure(2);
plot(p,o_out,'g');
hold on;
plot(p,t,'r');


%以下测试输出
P = xmin:(xmax-xmin)/(test_num-1):xmax ;%i_unitnum*sample_num
T = sin(P);
%归一化
P1 = (P-min(P))/(max(P)-min(P));

Dp_exp = [P1' ones(test_num,1)]';% (i_unitnum+1)*sample_num采样输入扩展
Dh_out = logsig(w_h_exp*Dp_exp); %h_unitnum*sample_num隐层输出
Dh_out_exp = [Dh_out' ones(test_num,1)]';%(h_unitnum+1)*sample_num隐层输出扩展
Do_out = w_o_exp*Dh_out_exp;%o_unitnum*sample_num
T1 = 2.*Do_out-1;
figure(3);
plot(P,T,'r');
hold on;
plot(P,T1,'g');

⌨️ 快捷键说明

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