本次所讲的是libsvm在matlab中的2个应用实例,是本学期模式识别的2个编程作业题。
一、16棋盘格数据分类
试验目的:产生16棋盘的训练数据,用svm训练出一个模型,然后对新来的样本进行分类预测。
试验说明:
- 训练数据样本数为1600个,即每个格子中随机产生100个数据点,分为2类,2种颜色分布在16个格子中,相交分布。测试数据样本点数为320个,即每个格子中的数据点为20个。
- 如果分类预测正确,则用绿色画出,预测错误,则用红色画出。
实验结果:
产生的训练样本分布图如下所示:
训练样本分布图如下:
预测结果如下(如果分类正确用绿色显示,否则用红色显示):
实验结果评价指标:
最后的预测准确度,MSE等指标如下所示:
实验源码即注释:
%% 随机产生16棋盘格数据点作为训练样本,每个数据格100个样本 %%样本数据放在checkerboard_16数组中 train_num=100; num=0; for i=1:4 for j=1:4 num=num+1; yellowflag=mod(num+i,2);%d当redflag=1时,产生样本点用红色表示,否则用绿色表示,主要这里是num+i对2取模 x=randi([100*(i-1) 100*i],train_num,1); %产生100个横坐标 y=randi([100*(j-1) 100*j],train_num,1); %产生100个列坐标 if yellowflag z=randi([1 1],train_num,1); else z=randi([0 0],train_num,1); end checkerboard_16b(:,:,num)=[x y z]; if num==1 checkerboard_16=checkerboard_16b(:,:,num); elseif(num>1) checkerboard_16=[checkerboard_16;checkerboard_16b(:,:,num)];%递归调用时一定要小心 end end end %% 画出产生的16棋盘样本训练数据分布示意图 for k=1:1600 if checkerboard_16(k,3)==1 plot(checkerboard_16(k,2),checkerboard_16(k,1),'yo'); else plot(checkerboard_16(k,2),checkerboard_16(k,1),'go'); end hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量 end title('训练数据分布'); axis([-10 420 -20 420]); %% 用svm训练分类模型 checkerboard_16_label=checkerboard_16(:,end);%取出样本类标签 checkerboard_16_data=checkerboard_16(:,1:end-1);%取出样本属性 model=svmtrain(checkerboard_16_label,checkerboard_16_data) %% 随机产生16棋盘格数据点作为训练样本,每个数据格100个样本 %%样本数据放在checkerboard_16_test数组中 train_num=20; num=0; for i=1:4 for j=1:4 num=num+1; redflag=mod(num+i,2);%d当redflag=1时,产生样本点用红色表示,否则用绿色表示 x=randi([100*(i-1) 100*i],train_num,1); %产生100个横坐标 y=randi([100*(j-1) 100*j],train_num,1); %产生100个列坐标 if redflag z=randi([1 1],train_num,1); else z=randi([0 0],train_num,1); end checkerboard_16_test_b(:,:,num)=[x y z]; if num==1 checkerboard_16_test=checkerboard_16_test_b(:,:,num); elseif(num>1) checkerboard_16_test=[checkerboard_16_test;checkerboard_16_test_b(:,:,num)];%递归调用时一定要小心 end end end %% 画出%% 画出产生的16棋盘样本测试数据分布示意图 figure; for k=1:320 if checkerboard_16_test(k,3)==1 plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'yo'); else plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go'); end hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量 end title('测试原数据分布'); axis([-10 420 -20 420]); %% 用svm进行预测 checkerboard_16_test_label=checkerboard_16_test(:,end); checkerboard_16_test_data=checkerboard_16_test(:,1:end-1); [checkerboard_16_predict_label,checkerboard_16_accuarcy]=svmpredict(checkerboard_16_test_label,checkerboard_16_test_data,model) %% 画出预测数据样本点的分布,并将预测错误的点用红色标记出来,正确预测的用绿色标记出来 figure; for k=1:320 if checkerboard_16_predict_label(k)==1 && checkerboard_16_test_label(k)==1 plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go'); elseif checkerboard_16_predict_label(k)==0 && checkerboard_16_test_label(k)==0 plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'go'); else plot(checkerboard_16_test(k,2),checkerboard_16_test(k,1),'ro'); end hold on %每次画完后要hold on,当然也可以使plot的2个参数为向量 end title('分类预测数据分布'); axis([-10 420 -20 420]);
实验总结:
由实验结果可知,预测准确度才65.9375%,比较低。原因是svm在训练的过程中采用的是默认参数,实际上我们应该对这些参数进行寻有,或者采用暴力查找。
二、UCI中iris数据分类
实验数据:
本次试验数据来源于http://archive.ics.uci.edu/ml/ 中的risi数据,其数据类别分为3类,setosa,versicolor,virginica.每类植物有50个样本,共150个。每个样本有4个属性,分别为花萼长,花萼宽,花瓣长,花瓣宽。
数据格式如下所示:
试验目的:用样本中的数据训练处的模型对新来的样本进行分类。
试验步骤:
- 把数据分为2部分,训练数据每类40个,测试数据每类10个。
- 用svm对训练数据进行学习。
- 用学习到的模型对预测数据进行分类。
实验代码:
1 load iris_new.data 2 iris_train_label=iris_new([1:40 51:90 101:140],end);%每类取40个数据作为训练,共120个训练数据 3 iris_train_data=iris_new([1:40 51:90 101:140],1:end-1); 4 iris_test_label=iris_new([41:50 91:100 141:150],end);%每类取10个数据作为测试,共30个测试数据 5 iris_test_data=iris_new([41:50 91:100 141:150],1:end-1); 6 save irisdata; 7 model=svmtrain(iris_train_label,iris_train_data); 8 [iris_predict_label,iris_accuracy]=svmpredict(iris_test_label,iris_test_data,model)
实验结果:
可见分类准确度为100%。
实验总结:通过本次试验,初步学会了libsvm在matlab中的应用。
大家有更好的解法欢迎提出并交流。