模式识别:BP算法实现
1 问题
1、学习资料区的例程,其中c04_04_LMSE_BPSample_Single_neuron.m为单神经元对线性可分样本分类,对应《线性判决法》PPT中的28页例子,对应公式为第27页。

2、学习《非线性判别方法》PPT中16-21页的BP算法推导,根据第22、23页的例子编写BP算法程序(改编c04_04_LMSE_BPSample_Single_neuron.m)。对《非线性判别方法》PPT中第24页的四个样本进行分类。
第一类:(0,0).(1,1);
第二类:(1,0)(0,1)。

3、拓展编程:已知函数y=(x-1)^2,输入x在[0,2]范围内间隔0.1取点,共21个点,对应21个y值。构建输入层为1个节点,隐层为3个节点,输出层为1个节点的神经网络,输入为x,输出为y。能否将上述第2项内容的程序实现在这个问题中?通过21组样本点的训练,得到隐层及输出层的权值。如果输入1.27,神经网络输出为多少?参考《非线性判别方法》PPT中第22页例程。

4、思考题:
如果有这样一组样本,如何使用第(3)部分程序,实现x=19对应的数据。
x=[9 10 11 12 13 14 15 16 17 18]
D=[0.50 9.36 52 192 350 571 912 1207 1682.69 2135]

2 方法描述及判别结果
方法描述步骤如下:
在这里插入图片描述
问题1和问题2的解决:
根据老师给的程序进行更改,对这个神经网络的拓扑图进行代码的编辑,然后对非线性的样本进行分类:
如图所示,这是分类后的图像
在这里插入图片描述
问题3.拓展编程
在这里插入图片描述
在问题1和问题2学习的基础上,增加隐含层节点(程序中是五个),在b站和csdn学习了神经网络工具箱的用法和对应的代码后,对函数进行拟合,并在net算出后进行数据拟合,在输入1.27后,得到神经网络的输出。
结果如图:
21个点的函数图像:
在这里插入图片描述
运算结果如下
在这里插入图片描述
神经网络拓扑图

在这里插入图片描述
成功拟合后的函数图像
在这里插入图片描述
数据预测的结果(X=1.27)
在这里插入图片描述
问题4的解决:
将X和D输入后,进行神经网络的训练,得到net后,再代入X=19的得到预测值,本质和问题3采用的神经网络工具箱的方法是一样的。

神经网络拓扑图
在这里插入图片描述
数据对应图像
在这里插入图片描述
拟合后的函数图像
在这里插入图片描述
工具箱计算结果
在这里插入图片描述
预测X=19时候的结果
在这里插入图片描述
,即D=2265

有老师给的模式识别三次作业标准参考程序,已放在资料区提供下载。
文件内容形式:
在这里插入图片描述

笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人、冬奥云支教等奖项。

程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!

3 自写程序附录
问题二
分类的代码

close all;
clear all;
close all;
 
% 训练样本
Class_1=  [1 0;
           1 0];
Class_2=  [0 1;
           1 0];
       
[m_1,n_1] = size(Class_1);   %%得到行列个数
[m_2,n_2] = size(Class_2);      
 
%%%%%%%%%%%%%%%%%%%%%%%%%%
% 绘图程序
%%%%%%%%%%%%%%%%%%%%%%%%%%
figure;
 
for i=1:n_1
    plot(Class_1(1,i),Class_1(2,i),'*');
    hold on;
end
for i=1:n_2    
    plot(Class_2(1,i),Class_2(2,i),'o');
    hold on;
end
 
axis([-0.5 1.5 -0.5 1.5]);
grid on;
 
Train_X=[Class_1 Class_2];
Train_Y=[1 1 0 0];  %%对应类别
 
r=10;%学习率
w=[0.1,0.1,0.1,0.1,0.8,0.1];          %网络连接权重w,图中六个
p=[1,1,1];        %神经元偏置三个
loop_limit = 1000;  %%最大循环次数
err_limit = 0.01;   %%误差平方和限制
 
for i=1:loop_limit
    err=0;
    for j=1:4 
        o1=Train_X(1,j);   %每个神经元的总输入和输出
        o2=Train_X(2,j);
        
        s3=o1*w(1)+o2*w(3)+p(1);
        o3=1/(1+exp(-s3));  %sigmoid函数
        
        s4=o1*w(2)+o2*w(4)+p(2);
        o4=1/(1+exp(-s4));
        
        s5=o3*w(5)+o4*w(6)+p(3)
        o5=1/(1+exp(-s5));  
        
        %输出层神经元的误差
        e5=o5*(1-o5)*(Train_Y(1,j)-o5);
        
        %隐含层神经元的误差
        e3=o3*(1-o3)*e5*w(5);
        e4=o4*(1-o4)*e5*w(6);
        
        %网络连接权值更新(后往前推)
        w(1)=w(1)+r*o1*e3;
        w(3)=w(3)+r*o2*e3;
        
        w(2)=w(2)+r*o1*e4;
        w(4)=w(4)+r*o2*e4;
        
        w(5)=w(5)+r*o3*e5;
        w(6)=w(6)+r*o4*e5;
        
        %神经元偏置更新
        p(1)=p(1)+r*e3;
        p(2)=p(2)+r*e4;
        p(3)=p(3)+r*e5;
        err=err+(Train_Y(1,j)-o5)^2
    end
    if err<err_limit
        break;
    end
end
 
x1=-0.5:0.01:1.5;
x21=(w(1)*x1+p(1))/w(3);
x22=(w(2)*x1+p(2))/w(4);
plot(x1,x21,x1,x22);
hold on;

问题三拓展编程代码:

clc;
clear all;
close all;
 
X=0:0.1:2;
[m,n]=size(X);
for i=1:n
    Y(i)=(X(i)-1)^2
end
 
figure;
plot(X,Y,'*');   %绘制原始数据分布图,X,D可以是元胞数组
net=newff([0 2],[5 1],{'logsig','logsig'});  %输入范围0-2,这里根据老师说的隐含层用5个神经元,输出层一个神经元,logsig是两个层的函数
view(net)
net.trainParam.epochs=5000;  %训练次数设置
net.trainParam.goal=0.0001;  %训练目标设置
net=train(net,X,Y);
O=sim(net,X);  %仿真
 
%作出拟合图形
figure; %画布2
plot(X,Y,'*',X,O); %绘制训练后得到的结果和误差曲线
grid;
V=net.iw{1,1};      %输入层到隐含层权值
theta1=net.b{1};    %隐含层各神经元阈值
W= net.lw{2,1};      %隐含层层到输出层权值
theta2=net.b{2};    %输出层各神经元阈值
 
%输出神经网络的预测值
predict=sim(net,1.27)

问题四,预测X=19时候的代码

clc;
clear all;
close all;
 
X=[9 10 11 12 13 14 15 16 17 18 ]
d=[0.50 9.36 52 192 350 571 912 1207 1682.69 2135 ]
 
for i=1:10
    Y(i)=d(i)/5000;
end
[m,n]=size(X);
 
figure;  %绘制原始数据分布图
plot(X,Y,'*');   %绘制原始数据分布图,X,D可以是元胞数组
net=newff(X,Y,[5 1],{'logsig','logsig'});  %输入是两个数组X、Y,且这里根据老师说的隐含层用5个神经元,输出层一个神经元,logsig是两个层的函数
view(net)
net.trainParam.epochs=10000;     %训练次数设置
net.trainParam.goal=0.000000001;     %训练目标设置
net=train(net,X,Y);
O=sim(net,X);  %仿真
 
%预测2019的数据
O2=sim(net,19);
O2=O2*5000   %输出,注意e+03是10的三次方,这是科学计数法
 
%%
%作出拟合图形
figure; %画布2
plot(X,Y,'*',X,O); %绘制训练后得到的结果和误差曲线
grid;
V=net.iw{1,1};      %输入层到隐含层权值
theta1=net.b{1};    %隐含层各神经元阈值
W= net.lw{2,1};      %隐含层层到输出层权值
theta2=net.b{2};    %输出层各神经元阈值

参考资料
CSDN:
https://blog.csdn.net/xuw_xy/article/details/103376692

b站:
https://www.bilibili.com/video/BV1H44y1j79h/?spm_id_from=333.788.recommend_more_video.-1

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐