笔者做了一个根据人的年龄判断人属于青少年、中年和老年人的一个bp神经网络分类。
%% 清空环境变量
clc
clear
%% 训练数据预测数据
data=xlsread('data.xlsx');
%从1到768间随机排序,产生随机数,防止过拟合
k=rand(1,40);%产生由在(0, 1)之间均匀分布的随机数组成的数组。
[m,n]=sort(k);%m是排序好的向量,n 是 向量m中对k的索引,这样就将随机数的排列顺序变成整数序号了,即随机抽取的样本
input=data(:,1);%输入数据
group=data(:,2);%标签
%随机提取30个样本为训练样本,从训练集和测试集随机选出10个样本为预测样本
input_train=input(n(1:30),:)';%训练样本,要转置
output_train=group(n(1:30),:)';%训练标签,要转置
input_test=input(n(31:40),:)';%测试样本,要转置
output_test=group(n(31:40),:)';%测试标签,要转置
%输入数据归一化
[inputn,inputps]=mapminmax(input_train);
%% BP网络训练
% %初始化网络结构
net=newff(inputn,output_train,10);
net.trainParam.epochs=1000;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
%% 网络训练
net=train(net,inputn,output_train);
%% BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%网络预测输出
BPoutput=sim(net,inputn_test);%预测标签
%% 结果分析
%根据网络输出找出数据属于哪类
BPoutput(find(BPoutput<1.5))=1;
BPoutput(find(BPoutput>=1.5&BPoutput<2.5))=2;
BPoutput(find(BPoutput>=2.5))=3;
%% 结果分析
%画出预测种类和实际种类的分类图
figure(1)
plot(BPoutput,'og')
hold on
plot(output_test,'r*');
legend('预测类别','输出类别')
title('BP网络预测分类与实际类别比对','fontsize',12)
ylabel('类别标签','fontsize',12)
xlabel('样本数目','fontsize',12)
ylim([-0.5 3.5])
%预测正确率
rightnumber=0;
for i=1:size(output_test,2)
if BPoutput(i)==output_test(i)
rightnumber=rightnumber+1;
end
end
rightratio=rightnumber/size(output_test,2)*100;
sprintf('测试准确率=%0.2f',rightratio)
数据如下:第一列为人的年龄,第二列为标签。
9 | 1 | 训练集 | |
12 | 1 | ||
23 | 1 | ||
2 | 1 | ||
4 | 1 | ||
5 | 1 | ||
27 | 1 | ||
29 | 1 | ||
14 | 1 | ||
19 | 1 | 0-30为青少年 | |
34 | 2 | ||
37 | 2 | ||
39 | 2 | ||
42 | 2 | ||
46 | 2 | ||
47 | 2 | ||
55 | 2 | ||
58 | 2 | ||
65 | 2 | ||
43 | 2 | 31-65为中年 | |
93 | 3 | ||
66 | 3 | ||
70 | 3 | ||
69 | 3 | ||
72 | 3 | ||
77 | 3 | ||
79 | 3 | ||
89 | 3 | ||
94 | 3 | ||
101 | 3 | 66以上为老年 | |
2 | 1 | 测试集 | |
100 | 3 | ||
60 | 2 | ||
41 | 2 | ||
23 | 1 | ||
76 | 3 | ||
81 | 3 | ||
93 | 3 | ||
56 | 2 | ||
12 | 1 |
注意:1 bp神经网络的是以列进行训练的,即列数为样本数,行数为特征数。所以数据在训练之前要进行转置。http://f.dataguru.cn/forum.php?mod=viewthread&action=printable&tid=542637 帖子也对这个问题进行了阐述
2 bp神经网络的训练函数名是train,所以输入的数据变量名不能写成train,以防两者冲突导致计算机无法辨别。可以写成train123.这样。
https://blog.csdn.net/weixin_42296976/article/details/81252809 帖子也对这个问题进行了阐述
3 bp神经网络训练函数newff等,及其参数参数调整,详解见:https://blog.csdn.net/ckzhb/article/details/60879570
4 想查看bp神经网络性能图、迭代图和预测线性回归图,详见操作:https://blog.csdn.net/Q1302182594/article/details/8790613