初步體驗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中的應用。

 

 

  大家有更好的解法歡迎提出並交流。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM