本次所講的是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中的應用。
大家有更好的解法歡迎提出並交流。