多层感知器就是我们称的BP神经网络,因此在做的过程中要明白BP网络的基本原理,这个原理在这里就不重复的讲了。
实现分类的过程用的是Matlab来实现的,数据集选用的是UCI提供的210条数据,共有3个类型(1,2,3),采用的是5-交叉验证的方法,对网络进行训练,并得到训练好的网络。因此在这个过程中要确定输入层,隐层,输出层的单元个数,由于类别标号为3个,因此输出层的单元个数我3,输入数据为7个,隐层的单元个数通过经典的公式来计算,一般确定为5-7个,就可以了。权值的获得是通过BP网络的默认的随机值来获得的。
具体的过程如下:
(1) 网络初始化:根据系统的输入确定网络的输入层节点的个数,隐含层节点的个数,输出层节点的个数,输入层、隐含层和输出层神经元之间的连接权值wij,wjk。初始化隐含层阈值、输出层阈值,给定学习速率和激励函数;
(2) 隐含层输出计算:根据权值和阈值,计算隐含层输出H;
(3) 输出层输出计算:根据隐含层输出H,连接权值和阈值,计算BP神经网络预测输出O;’
(4) 误差计算:根据网络预测输出和期望输出,计算网络预测误差;
(5) 权值更新:根据网络预测误差更新连接权重;
(6) 阈值更新:根据误差更新节点阈值;
(7) 判断算法迭代是否结束,若没有结束则返回步骤2.
具体的Matlab的代码如下:
%%...................................................
%%对环境和数据进行预处理
%%...................................................
%%清除环境变量
clc
clear
%%导入数据
N=load('D:\seeds_dataset.txt');
%%对于导入的数据进行分组
date1=[N(1:14,:);N(85:98,:);N(183:196,:)]';
date2=[N(29:42,:);N(71:84,:);N(141:154,:)]';
date3=[N(15:28,:);N(99:112,:);N(155:168,:)]';
date4=[N(57:70,:);N(127:140,:);N(197:210,:)]';
date5=[N(43:56,:);N(113:126,:);N(169:182,:)]';
%%对于分组的数据进行合并成一个新的数组,具体的顺序任意
data=[date2,date1,date3,date4,date5]';
%%输入输出数据,提取前7列和第8列的内容单独成一个矩阵
input=data(:,1:7);
output=data(:,8);
%%提取出矩阵后,由于输出的矩阵是3维的因此要变换成3维的形式
for i=1:210
switch output(i)
case 1
output1(i,:)=[1 0 0];
case 2
output1(i,:)=[0 1 0];
case 3
output1(i,:)=[0 0 1];
end
end
%%对输入的矩阵处理完输入的形式了,接下来就是划分训练和测试集
input_train=input(1:168,:)';
output_train=output1(1:168,:)';
input_test=input(169:210,:)';
output_test=output1(169:210,:)';
%%对数据进行归一化处理
[inputn,inputps]=mapminmax(input_train);
%%.................................................
%%用matlab自带的工具箱里的函数来进行预测过程
%%.................................................
%%设置参数
net=newff(input_train,output_train,5,{'logsig' 'purelin'},'traingda');
%%初始化
net=init(net);
%%设置训练参数和训练BP网络
net.trainParam.epochs = 5000;
net.trainParam.goal = 0.0001;
net.trainParam.show = 10;
net.trainParam.lr=0.01;
%%训练BP神经网络
net = train(net,input_train,output_train);
a = sim(net,input_train);
for i=1:42
output_fore(i)=find(a(:,i)==max(a(:,i)));
end
%%BP训练结束
%BP网络预测误差
error=output_fore-output(169:210)';
%%................................................
figure(1)
plot(output_fore,'-. r *')
hold on
plot(output(169:210)',' -.b p')
legend('预测类别编号','实际类别编号')
%画出误差图
figure(2)
plot(error)
title('BP网络分类误差','fontsize',12)
xlabel('机器学习特性','fontsize',12)
ylabel('分类误差','fontsize',12)
k=zeros(1,3);
%找出判断错误的分类属于哪一类
for i=1:42
if error(i)~=0
[b,c]=max(output_test(:,i));
switch c
case 1
k(1)=k(1)+1;
case 2
k(2)=k(2)+1;
case 3
k(3)=k(3)+1;
end
end
end
%找出每类的个体和
kk=zeros(1,3);
for i=1:42
[b,c]=max(output_test(:,i));
switch c
case 1
kk(1)=kk(1)+1;
case 2
kk(2)=kk(2)+1;
case 3
kk(3)=kk(3)+1;
end
end
%正确率
right_rate5=(kk-k)./kk
执行效果: