學習筆記|模式識別|SVM分類和libsvm在matlab中的使用

一、SVM介紹

傳統學習方法採用的經驗風險最小化方法(ERM)雖然將誤差最小化,但不能最小化學習過程的泛化誤差。ERM方法不成功的例子就是神經網絡中的過學習問題。爲此,由Vapnik領導的貝爾實驗室研究小組於1963年提出了一種新的非常有潛力的技術,支持向量機(Support vector machine,SVM)是一種基於統計學習理論的模式識別方法,主要用用於模式識別領域。

SVM的基本思想是在樣本空間或特徵空間構造出最優超平面,使得超平面與不同樣本集之間的距離最大,從而達到最大的泛化能力。

關於SVM原理的解析網上有很多詳盡的資料了,在這裏列出一些我個人覺得解釋的不錯的。

1、支持向量機(SVM)詳細推導及理解(1)

2、機器學習算法(一)SVM

在看別人的總結中,發現了一些不錯的點,在這裏摘錄一下。(詳細的還得去翻上面的兩個連接)

1、SVM 算法特性
(1)訓練好的模型的算法複雜度是由支持向量的個數決定的,而不是由數據的維度決定的。所以 SVM 不太容易產生 overfitting。
(2)SVM 訓練出來的模型完全依賴於支持向量,即使訓練集裏面所有非支持向量的點都被去除,重複訓練過程,結果仍然會得到完全一樣的模型。
(3)一個 SVM 如果訓練得出的支持向量個數比較少,那麼SVM 訓練出的模型比較容易被泛化。
2、SVM基本思想的簡單描述(不包含推導,只是爲了方便我記憶)

(1)分類線方程: 

(2)分類間隔:,使分類間隔最大化等價於使最小化

(3)超平面一邊的點都有,另一邊的點則有

(4)假設現在有兩類數據,標籤y爲+1和-1,調整w,使超平面定義如下:

綜合以上兩式,有,這個式子是約束條件

(5)因此這個最小化優化問題可以用拉格朗日方法求解,令

其中爲每個樣本的拉格朗日乘子。

(6)現在需要最大化,所以問題變成。根據拉格朗日的對偶性,原始的極小極大問題變成了現在的極大極小問題 \large \mathop {\max }\limits_\alpha \mathop {\min }\limits_{w,b} L(w,b,\alpha )

(7)求  \large \mathop {\min }\limits_{w,b} L(w,b,\alpha )

L分別對b和w求導數並令其等於0,得到:

                

把上面這兩個式子代回,得到

(8)求 \large \mathop {\min }\limits_{w,b} L(w,b,\alpha ) 對 \large \alpha 的極大值

問題變爲:

所以只要知道 \large {\alpha }, 也就知道\large w了。(關鍵點就在求解\large {\alpha }

\large {\alpha }的求解:使用SMO(Sequential Minimal Optimization)即序列最小最優化來求解。(過程比較複雜,不做詳解)

得到 \large {\alpha }後,相當於知道哪些樣本點是支持向量了,因爲支持向量的 \large {\alpha }>0,非支持向量的 \large {\alpha }=0。

(9)然後把 \large {\alpha }代入,求解得到\large w 。

再把 \large w 代入,求解得到b。

(10)至此,\large w 和b都得到了,所以代入超平面公式可得超平面

而分類決策函數爲:,根據符號來判斷測試樣本的類別。

 

二、libsvm在matlab中的使用

(1)首先去官網下載libsvm工具包,將其解壓到MATLAB->toolbox的安裝路徑

(2)在MATLAB軟件中設置路徑->添加文件夾,將解壓後的文件夾添加到工具箱

(3)然後將工作區設置到這個文件夾下的matlab文件夾下,在MATLAB的命令行區執行“make”命令來編譯文件(一定要編譯),直到文件夾下出現了4個後綴爲mexw64的文件

好了,現在可以使用libsvm的函數了。

(1)libsvm的兩個主要函數爲:svmtrain和svmpredict

關於這兩個函數的參數和返回變量的介紹和使用可以看這篇文章:libsvmpredict和svmtrain的參數和返回值

(2)libsvm包含了幾種類型的SVM算法,關於他們的介紹可以看這篇文章:libsvm中svm類型簡介

下面是一段《模式識別與人工智能(基於matlab)》中的代碼。

clear;
clc;
load SVM % 數據都存在SVM.mat這個文件中,要load一下

% 訓練數據和標籤
% 數據有3個屬性,4個類別
% 訓練數據有30個
train_train = [train(1:4,:);train(5:11,:);train(12:19,:);train(20:30,:)]; % 手動劃4分類
train_target = [target(1:4);target(5:11);target(12:19);target(20:30)];

% 測試數據和標籤
% 測試數據有30個
test_simulation = [simulation(1:6,:);simulation(7:11,:);simulation(12:24,:);simulation(25:30,:)];
test_labels = [labels(1:6);labels(7:11);labels(12:24);labels(25:30)];

 
model = svmtrain(train_target, train_train, '-c 2 -g 0.2 -t 1'); % 核函數爲多項式核函數

[predict_label, accuracy, dec_values] = svmpredict(test_labels, test_simulation, model);
% predict_label:預測得到的測試樣本的標籤
% accuracy:預測準確率
% dec_values:樣本分別屬於每一個類別的概率

predict_label

hold off
f=predict_label';
index1=find(f==1);
index2=find(f==2);
index3=find(f==3);
index4=find(f==4);
plot3(simulation(:,1),simulation(:,2),simulation(:,3),'o');
line(simulation(index1,1),simulation(index1,2),simulation(index1,3),'linestyle','none','marker','*','color','g');
line(simulation(index2,1),simulation(index2,2),simulation(index2,3),'linestyle','none','marker','<','color','r');
line(simulation(index3,1),simulation(index3,2),simulation(index3,3),'linestyle','none','marker','+','color','b');
line(simulation(index4,1),simulation(index4,2),simulation(index4,3),'linestyle','none','marker','>','color','y');
box;grid on;hold on;
xlabel('A');
ylabel('B');
zlabel('C');
title('支持向量機分析圖');

 

運行結果圖爲:

命令行窗口結果爲:

Accuracy = 96.6667% (29/30) (classification)

predict_label =

     1
     1
     1
     1
     1
     1
     2
     2
     2
     2
     2
     3
     3
     3
     3
     3
     3
     2
     3
     3
     3
     3
     3
     3
     4
     4
     4
     4
     4
     4
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章