zoukankan      html  css  js  c++  java
  • 初步体验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在训练的过程中采用的是默认参数,实际上我们应该对这些参数进行寻有,或者采用暴力查找。

     

     

    二、UCIiris数据分类

    实验数据:

      本次试验数据来源于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,欢迎交流!)
  • 相关阅读:
    github上比较有名的一个前端面试题,随便做做(4)
    常见动态内存的管理程序错误
    .Net笔记(一)is和 as
    消息映射宏
    组态软件分析(第一节)
    指针形参与引用形参区别
    MFC 消息映射的产生
    WPF 路由事件(一)
    C# 封装集合
    Xaml Code Behind Generator (XAML 转成C#代码)
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2534939.html
Copyright © 2011-2022 走看看