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

来源:互联网 发布:魔兽争霸3冰封王座mac 编辑:程序博客网 时间:2024/05/16 01:52

update:把程序源码和数据集也附上http://download.csdn.net/detail/zjccoder/8832699

2015.6.24

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

wine数据来自于UCI数据库,记录的是意大利同一地区3中不同品种的葡萄酒13中化学成分含量,以期通过科学的方法,达到自动分类葡萄酒的目的。

本次分类的数据共有178个样本,每个样本有13个属性,并提供每个样本的正确分类,用于检验SVM分类的准确定。

首先我们画出数据的可视化图:

% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量load chapter_WineClass.mat;% 画出测试数据的box可视化图figure;boxplot(wine,'orientation','horizontal','labels',categories);title('wine数据的box可视化图','FontSize',12);xlabel('属性值','FontSize',12);grid on;% 画出测试数据的分维可视化图figuresubplot(3,5,1);hold onfor run = 1:178    plot(run,wine_labels(run),'*');endxlabel('样本','FontSize',10);ylabel('类别标签','FontSize',10);title('class','FontSize',10);for run = 2:14    subplot(3,5,run);    hold on;    str = ['attrib ',num2str(run-1)];    for i = 1:178        plot(i,wine(i,run-1),'*');    end    xlabel('样本','FontSize',10);    ylabel('属性值','FontSize',10);    title(str,'FontSize',10);end


(图1)


(图2)


图1是wine数据的box可视化图,图2是wine的箱式图,从图上我们很难分出每一种葡萄酒是哪种类型。下面我们尝试用SVM来分类。


数据的预处理

% 选定训练集和测试集% 将第一类的1-30,第二类的60-95,第三类的131-153做为训练集train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];% 相应的训练集的标签也要分离出来train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];% 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];% 相应的测试集的标签也要分离出来test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];<strong>%% 数据预处理</strong>% 数据预处理,将训练集和测试集归一化到[0,1]区间[mtrain,ntrain] = size(train_wine);[mtest,ntest] = size(test_wine);dataset = [train_wine;test_wine];% mapminmax为MATLAB自带的归一化函数[dataset_scale,ps] = mapminmax(dataset',0,1);dataset_scale = dataset_scale';train_wine = dataset_scale(1:mtrain,:);test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );


SVM网络建立、训练和预测

<span style="font-size:12px;">%% SVM网络训练model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1');%% SVM网络预测[predict_label, accuracy,dec_value1] = svmpredict(test_wine_labels, test_wine, model);</span>


结果分析

%% 结果分析% 测试集的实际分类和预测分类图% 通过图可以看出只有一个测试样本是被错分的figure;hold on;plot(test_wine_labels,'o');plot(predict_label,'r*');xlabel('测试集样本','FontSize',12);ylabel('类别标签','FontSize',12);legend('实际测试集分类','预测测试集分类');title('测试集的实际分类和预测分类图','FontSize',12);grid on;


利用svm分类的准确率达到了98.8764%,在89个测试样本中仅有一个被分类错误。可见SVM在数据分类方面的强大!

END


3 0
原创粉丝点击