初步体验libsvm用法3(matlab实例)

来源:互联网 发布:淘宝流量和访客的区别 编辑:程序博客网 时间:2024/04/30 05:56

 本次所讲的是libsvm在matlab中的2个应用实例,是本学期模式识别的2个编程作业题。

 

一、16棋盘格数据分类

试验目的:产生16棋盘的训练数据,用svm训练出一个模型,然后对新来的样本进行分类预测。

试验说明:

  1. 训练数据样本数为1600个,即每个格子中随机产生100个数据点,分为2类,2种颜色分布在16个格子中,相交分布。测试数据样本点数为320个,即每个格子中的数据点为20个。
  2. 如果分类预测正确,则用绿色画出,预测错误,则用红色画出。

实验结果:

  产生的训练样本分布图如下所示:

  

  训练样本分布图如下:

  

  

  预测结果如下(如果分类正确用绿色显示,否则用红色显示):

  

  

实验结果评价指标:

  最后的预测准确度,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    endend%% 画出产生的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个参数为向量endtitle('训练数据分布');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    endend%% 画出%% 画出产生的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个参数为向量endtitle('测试原数据分布');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个参数为向量endtitle('分类预测数据分布');axis([-10 420 -20 420]);
复制代码

 

实验总结:

   由实验结果可知,预测准确度才65.9375%,比较低。原因是svm在训练的过程中采用的是默认参数,实际上我们应该对这些参数进行寻有,或者采用暴力查找。

 

 

二、UCI中iris数据分类

 

实验数据:

  本次试验数据来源于http://archive.ics.uci.edu/ml/ 中的risi数据,其数据类别分为3类,setosa,versicolor,virginica.每类植物有50个样本,共150个。每个样本有4个属性,分别为花萼长,花萼宽,花瓣长,花瓣宽。

  数据格式如下所示:

  

试验目的:用样本中的数据训练处的模型对新来的样本进行分类。

试验步骤:

  1. 把数据分为2部分,训练数据每类40个,测试数据每类10个。
  2. 用svm对训练数据进行学习。
  3. 用学习到的模型对预测数据进行分类。

实验代码:

复制代码
1 load iris_new.data2 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中的应用。

 

 

  大家有更好的解法欢迎提出并交流。

 

 

 

 

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
0 0
原创粉丝点击