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

 本次所讲的是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
    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个属性,分别为花萼长,花萼宽,花瓣长,花瓣宽。

  数据格式如下所示:

  

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

试验步骤:

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

实验代码:

复制代码
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中的应用。

 

 

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

 

 

 

 

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页