本文结合《MATLAB神经网络43个案例》的第一章算法,采用变体的方式,用一种更为简洁的形式实现BP神经网络的数据分类。
上代码!
一、数据处理
%% 读取4种语音数据
load data1 c1
load data2 c2
load data3 c3
load data4 c4
data=[c1;c2;c3;c4];%合并数据集
%% 数据处理
output1=data(:,1);%第一列为标签(1-4)
input=data(:,2:end);%其余列为数据
%标签扩展
output=zeros(2000,4);
for i=1:2000
switch output1(i)
case 1
output(i,:)=[1 0 0 0];%对应标签1
case 2
output(i,:)=[0 1 0 0];%对应标签2
case 3
output(i,:)=[0 0 1 0];%对应标签3
case 4
output(i,:)=[0 0 0 1];%对应标签4
end
end
二、训练集与测试集
%% 随机抽1900组数据为训练集 100组数据为测试集
%随机数
k=randperm(2000);% 1-2000 随机排列
%随机抽样
input_train=input(k(1:1900),:)';
input_test=input(k(1901:end),:)';
output_train=output(k(1:1900),:)';
output_test=output(k(1901:end),:)';
三、训练集归一化
%首字母大写代表归一化后的数据 IN OUT是归一化信息结构体
%归一化数据范围(-1,1)
[Input_train,IN]=mapminmax(input_train);
[Output_train,OUT]=mapminmax(output_train);
四、构建神经网络、设置网络参数
隐含层节点数对BP神经网络预测精度有较大影响。节点太少,网络无法很好的学习;节点太多,网络容易过拟合。最佳隐含层节点数选择公式如下:
①隐含层节点数<输入层节点数-1
②隐含层节点数< sqrt(输入层节点数+输出层节点数)+a(a是0~10的常数)
net=newff(Input_train,Output_train, 23 );%隐藏层神经元个数23
view(net);%打开net模型GUI界面
net.trainParam.epochs=1000;%迭代次数
net.trainParam.lr=0.01;%学习率
net.trainParam.goal=0.00001;%最小目标误差(这里是均方误差)
五、训练神经网络、进行预测
%神经网络训练
net=train(net,Input_train,Output_train);
%测试集归一化
Input_test=mapminmax('apply',input_test,IN);
%仿真测试
Output_test_predict=sim(net,Input_test);%得预测结果
%预测结果反归一化
output_test_predict=mapminmax('reverse',Output_test_predict,OUT);
%对预测结果取整
output_test_predict=round(output_test_predict);
六、分类效果比对
%预测结果
yhat=output_test_predict';
%原测试集
y=output_test';
%还原成1维标签
for row=1:size(yhat,1)
for col=1:4
if yhat(row,col)==1
yhat(row,:)=col;
end
if y(row,col)==1
y(row,:)=col;
end
end
end
%留下第一列 其余去掉
yhat(:,2:end)=[];
y(:,2:end)=[];
%分类结果
contrast=[yhat,y]%结果对比
accurary=sum(yhat==y);%分类准确率
disp(['分类准确率为',num2str(accurary),'%']);
效果展示
总结
准确率基本稳定在90%上下,模型还可以进一步优化。以此实现更好的分类准确率。