基于BP网络的数据分类预测——意大利葡萄酒种类识别

本文介绍了使用BP神经网络对UCIMachineLearningRepository中的葡萄酒数据进行分类的过程,包括数据预处理、划分训练集和测试集、网络结构设定、权重初始化以及迭代训练。最后展示了网络的预测结果、分类误差分析和正确率评估。
摘要由CSDN通过智能技术生成

BP神经网络数据分类是一种基于神经网络的数据分类方法,它通过构建一个BP神经网络模型,将输入数据映射到输出结果,从而实现数据的分类。

数据:UCI Machine Learning Repository

%% 清空环境变量

clc
clear

%% 数据提取

% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量

load chapter_WineClass.mat;

%输入输出数据

input=wine;
output1 =wine_labels;

%把输出从1维变成3维

output=zeros(178,3);
for i=1:178
    switch output1(i)
        case 1
            output(i,:)=[1 0 0];
        case 2
            output(i,:)=[0 1 0];
        case 3
            output(i,:)=[0 0 1];
    end
end


% 随机选定训练集和测试集

k_1=rand(1,59);
[m_1,n_1]=sort(k_1);
k_2=rand(1,71);
[m_2,n_2]=sort(k_2);
k_3=rand(1,48);
[m_3,n_3]=sort(k_3);


% 将第一类的1-30,第二类的60-95,第三类的131-153做为训练集
input_train= [input(n_1(1:30),:);input((59.+n_2(1:35)),:);input((130.+n_3(1:24)),:)]';
% 相应的训练集的标签也要分离出来
output_train = [output(n_1(1:30),:);output((59.+n_2(1:35)),:);output((130.+n_3(1:24)),:)]';
% 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集
input_test =[input(n_1(31:59),:);input((59.+n_2(36:71)),:);input((130.+n_3(25:48)),:)]';
% 相应的测试集的标签也要分离出来
output_test = [output((n_1(31:59)),:);output((59.+n_2(36:71)),:);output((130.+n_3(25:48)),:)]';
output_test1=[output1(n_1(31:59));output1(59.+n_2(36:71));output1(130.+n_3(25:48))];
clear k_1 k_2 k_3 m_1 m_2 m_3 n_1 n_2 n_3

%输入数据归一化

[inputn,inputps]=mapminmax(input_train);

%% 网络结构初始化
 

innum=13;
midnum=14;
outnum=3;

%权值初始化

w1=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,outnum);
b2=rands(outnum,1);

w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;

%学习率

xite=0.1;
alfa=0.01;
loopNumber=10;
I=zeros(1,midnum);
Iout=zeros(1,midnum);
FI=zeros(1,midnum);
dw1=zeros(innum,midnum);
db1=zeros(1,midnum);

%% 网络训练

E=zeros(1,loopNumber);
for ii=1:loopNumber
    E(ii)=0;
    for i=1:1:89
       %% 网络预测输出 
        x=inputn(:,i);
        % 隐含层输出
        for j=1:1:midnum
            I(j)=inputn(:,i)'*w1(j,:)'+b1(j);
            Iout(j)=1/(1+exp(-I(j)));
        end
        % 输出层输出
        yn=w2'*Iout'+b2;
        
       %% 权值阀值修正
        %计算误差
        e=output_train(:,i)-yn;     
        E(ii)=E(ii)+sum(abs(e));
        
        %计算权值变化率
        dw2=e*Iout;
        db2=e';
        
        for j=1:1:midnum
            S=1/(1+exp(-I(j)));
            FI(j)=S*(1-S);
        end      
        for k=1:1:innum
            for j=1:1:midnum
                dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3));
                db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3));
            end
        end
           
        w1=w1_1+xite*dw1';
        b1=b1_1+xite*db1';
        w2=w2_1+xite*dw2';
        b2=b2_1+xite*db2';
        
        w1_2=w1_1;w1_1=w1;
        w2_2=w2_1;w2_1=w2;
        b1_2=b1_1;b1_1=b1;
        b2_2=b2_1;b2_1=b2;
    end
end


 

%%意大利葡萄酒种类识别

inputn_test=mapminmax('apply',input_test,inputps);
fore=zeros(3,89);
for ii=1:1
    for i=1:89
        %隐含层输出
        for j=1:1:midnum
            I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);
            Iout(j)=1/(1+exp(-I(j)));
        end
        
        fore(:,i)=w2'*Iout'+b2;
    end
end

%% 结果分析


%根据网络输出找出数据属于哪类

output_fore=zeros(1,89);
for i=1:89
    output_fore(i)=find(fore(:,i)==max(fore(:,i)));
end

%BP网络预测误差

error=output_fore-output_test1';

%画出预测意大利葡萄酒种类识别分类图

figure(1)
plot(output_fore,'r')
hold on
plot(output_test1','b')
legend('预测意大利葡萄酒种类识别','实际意大利葡萄酒种类识别')

%画出误差图

figure(2)
plot(error)
title('BP网络分类误差','fontsize',12)
xlabel('意大利葡萄酒种类','fontsize',12)
ylabel('分类误差','fontsize',12)

%print -dtiff -r600 1-4

k=zeros(1,3);  


%找出判断错误的分类属于哪一类

for i=1:89
    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:89
    [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

%正确率

rightridio=(kk-k)./kk;
disp('正确率')
disp(rightridio);

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着我国葡萄酒业的逐步发展,葡萄酒生产企业的规模和数量不断扩大。但中国的葡萄酒业仍面临着进口酒的激烈竞争以及质量检测体系不明确带来的市场紊乱。针对这些问题,本文分析葡萄酒质量人工品尝存在的不足,并提出了如何提高基于数据挖掘技术的葡萄酒质量等级的识别率,对中国葡萄酒市场的稳定发展以及更好地酿造出高质量的葡萄酒有着实际的应用价值。在数据挖掘中,经常会遇到不平衡数据分析。相对于多数类来说,少数类样本对准确率的影响力小,这意味着对所有样本进行分类,可以在不识别出任何少数类样本的情况下得到很高的正确率,识别少数类的分类规则也就被忽略了。本文的创新点在于从不平衡样本中提取平衡样本进行建模并对测试样本预测,进行多次的循环,得到多次的预测结果,选择次数出现最多的预测结果作为最终的预测结果,大大提高了低质量葡萄酒识别率。本文采用BP神经网络葡萄酒种类进行模式识别,通过对在意大利同一区域里三种的葡萄酒的化学成分分析数据含有178个样本,每个样本含有13个特征分量,每个样本的类别标签已定。其中将这178个样本的65%作为训练样本,另外35%作为测试样本,用训练样本对BP神经网络进行训练可以得到相对应的分类模型,在利用训练好的模型对测试样本进行分类识别

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值