matlab BP网络


clear all
clc
%% 读取数据
load wine_dataset
input=wineInputs;
output=wineTargets;
for i=1:1:size(wineTargets,2)
    output1(i)=find(wineTargets(:,i)==max(wineTargets(:,i)))
end
%% 设置训练数据和预测数据
%训练集124 测试集54
input_train = input(:,[1:42 60:110 131:164]);
output_train =output(:,[1:42 60:110 131:164]);
input_test = input(:,[43:59 111:130 165:178]);
output_test = output(:,[43:59 111:130 165:178]);

train_output1=output1([1:42 60:110 131:164]);
test_output1=output1([43:59 111:130 165:178]);
%节点个数
%inputnum=size(input_train,1);%返回矩阵行数
hidden_num=10;%隐含层节点数量经验公式p=sqrt(m+n)+a ,故分别取2~13进行试验
%outputnum=size(output_train,1);
%% 训练样本数据归一化
[inputn,input_ps]=mapminmax(input_train);%归一化到[-1,1]之间,input_ps用来作下一次同样的归一化
[outputn,output_ps]=mapminmax(output_train);
%% 构建BP神经网络
net=newff(inputn,outputn,hidden_num,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练

W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值

W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值

%% 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000;         % 训练次数
net.trainParam.lr=0.01;                   % 学习率
net.trainParam.goal=0.0001;                    % 训练目标最小误差
net.trainParam.show=25;%显示频率
net.trainParam.mc=0.01;%动量因子
net.trainParam.min_grad=1e-6;%最小性能梯度
net.trainParam.max_fail=6;%最高失败次数


%% BP神经网络训练
[net,tr]=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
figure(1),plotperform(tr)%误差MSE下降线
%训练集的输出
an0=sim(net,inputn)
LabelNumber_train=size(an0,2);
train_sim=mapminmax('reverse',an0,output_ps);

%% 计算训练集分类结果和误差
for i=1:1:LabelNumber_train
    train_output(i)=find(train_sim(:,i)==max(train_sim(:,i)));
end
error0=train_output-train_output1;%计算训练集分类的误差
%% 测试样本归一化
inputn_test=mapminmax('apply',input_test,input_ps);% 对样本数据进行归一化

%% BP神经网络预测
an1=sim(net,inputn_test); %用训练好的模型进行仿真
LabelNumber_test=size(an1,2);
test_sim=mapminmax('reverse',an1,output_ps);%把仿真得到的数据还原为原始的数量级
%% 计算测试集分类结果和误差
for i=1:1:LabelNumber_test
    test_output(i)=find(test_sim(:,i)==max(test_sim(:,i)));
end
error=test_output-test_output1;%计算测试集分类的误差
%% 网络预测图形
%绘出预测红酒种类和实际红酒种类的分类图像
figure(2)
plot(test_output,'ro')
hold on
plot(test_output1,'b*')
xlabel('测试样本组数','fontsize',12)
ylabel('类别','fontsize',12)
legend('预测红酒种类','实际红酒种类')

%绘出测试集误差图
figure(3)
stem(error,'g')
set(gca,'color','black');
ylim([-3.5,4])
title('BP网络红酒分类误差','fontsize',12)
xlabel('测试样本组数','fontsize',12)
ylabel('分类误差','fontsize',12)

%% 训练集和测试集的误差分布直方图
%figure(4)
%ploterrhist(error0,'Train',error,'Test')

%% 找出判断错误的分类属于哪一类
number=zeros(1,3);
for i=1:LabelNumber_test
    if error(i)~=0
        [b,c]=max(output_test(:,i));
        switch c
            case 1
                number(1)=number(1)+1;
            case 2
                number(2)=number(2)+1;
            case 3
                number(3)=number(3)+1;
        end
    end
end


%% 找出每类的个体和
number_sum=zeros(1,3);
for i=1:LabelNumber_test
    [b,c]=max(output_test(:,i));
    switch c
        case 1
            number_sum(1)=number_sum(1)+1;
        case 2
            number_sum(2)=number_sum(2)+1;
        case 3
            number_sum(3)=number_sum(3)+1;
    end
end

%% 输出测试的红酒真实类别和预测类别对比结果
disp(['-----------------------真实类别和预测类别对比结果--------------------------'])
for i=1:1:size(test_output1,2)
    disp(['第',num2str(i),'个红酒样本实际类别为:',num2str(test_output1(i)),',预测类别为:',num2str(test_output(i))]);
end

%% 计算测试的红酒的分类正确率
right=(number_sum-number)./number_sum;            %计算每类红酒的分类正确率
disp(['-----------------------三类红酒的分类正确率--------------------------'])
disp(right)


















你可能感兴趣的:(深度学习)