Svm and libsvm3. What is SVM(Support Vector Machine)
• 支撐向量機(Support Vector Machine),以下都簡稱為SVM,SVM
是可以用來作為分類(classification)的工具,所謂的分類簡單來說
就是會將屬性類似的歸為一類。
• SVM是一種演算法,包含了數學工具、統計方法等等
• 當我們在使用SVM時,
①我們會給予已經分類好的資料,SVM就會透過這組資料建立模型,
②往後當有新資料想分類時,我們就可以利用先前建立的模型,來判斷此
資料的分類
4. Think a Scenario about classification
很會游泳 體重 身高 臂長 體指 腳長
data1 Yes 60 190 100 13 110
data2 no 55 170 80 15 120
data3 Yes 40 160 90 30 130
data4 no 70 165 120 20 140
data5 Yes 66 176 99 9 90
老師想要尋找班上的游泳好手, 於是將全班的學生抓來游
泳池測驗,測驗的結果的確有人游的如魚得水, 但有人游
的就很吃力,以下就是老師的實驗數據(只列出部分)
Training Data
5. Predict by SVM
• 某日校長要老師開體育班,要對全校每個學生檢測…但這樣太沒
效率,但有什麼方法可以透過剛剛觀察的結果,來預測分析每個
學生是不是游泳的料呢?
• 老師想到, 可以用SVM來解決這個問題。
6. SVM Concepts
• 讓 training data 在 特徵空間中,找到一個超平面將這些資料分開來。
• 特徵空間: 一個多維的空間;我們可以看到下圖,如果想要在原空間將這
些零散的資料,清楚劃分成兩類,就需要用到橢圓方程式,但是如果我們透
過一些方式將原空間的資料轉換到特徵空間,這時候我們就可以找到一個平
面將資料成功劃分。
7. SVM FOR predict
• 換句話說,老師可以將班上同學測游泳的data轉換到一個 feature
space上,然後透過一個平面切割成兩類,
• 如果要測試其它學生會不會游泳時,只要給受測者學生的data(跟
training data一樣的特徵欄位), 然後SVM就會判斷學生會不會游泳
了(分類, classification)。
9. 多類資料分法
• 如果要將學生分成三類, 1. 很會游 2. 會游 3. 不會游, how to do?
• 主要有兩種方法
• 1. One-against-One 一對一
• 2. One-against-All 一對多
14. 基本 libsvm classify 流程
• 1. 把training data 轉換成 libsvm看得懂得格式
• 2. train model
• 3. 把test data丟到model裡取得分類結果
15. 1.
把training data 轉換成 libsvm看得懂得格式
Label: 該data屬於哪一類, 通常是一些整數
Index: 該特徵的編號
Value: 特徵值
以剛剛提到游泳的例子,身高、體重都是該data特徵
N維空間就有N組特徵 (feature space)
16. Use svm-toy (simulator)
• 用svmtoy幫助我們產出training data作測試
這裡的點就是我們的training data,
而model紀錄的就是點的分部狀況,
右圖是按下run之後模擬這些點所產生
Model的結果(並不是真的產生model)
18. 2. train model (svm-train.exe)
• 使用svm-toy產出training data後, 我們要下指令去train這組data, 並
產出model file.
此例子train完後, 會產出
train_data.model
在當前目錄
What does this output mean?
See
http://www.csie.cyut.edu.tw/~shwu/PR_slide/SVM.pdf
19. 3. 把test data丟到model裡取得分類結果
• 語法: svm-predict.exe test_file model_file output_file
• test_file就是我們要拿來預測的資料,格式跟之前提到的
training data是一樣的,
[label] [index1]:[value1] [index2]:[value2] ...
• Predict完會把predict的結果跟test_file的分類作比較, 如此就可
以知道這個model預測有多準確, 也方便調整參數。
• test_file 不一定要跟 training data一樣有 class label (可不用分
類), 但必須放一個隨意整數;單純得到test_file的分類結果。
22. 預測誰是游泳好手?
Class 1 : 很會游泳
Class 2 : 可能不太行
Training data Test data
Run easy.py
Predict result
Editor's Notes 老師想要尋找游泳好手, 於是將全班的學生抓來游泳池測驗,測驗的結果的確有人遊的如魚得水, 但有人遊的就很吃力,以下就是老師的實驗數據 一群一群兩兩比對,
C跟A建立超平面
C跟B建立超平面
A跟B建立超平面
怎麼知道該學生是哪一類的? 用兩兩相比多數決
先看A,C, 歸類在A
再看C,B, 歸類在C
再看A,B, 歸類在A
被歸類在C的有1票
歸類在A的有2票
所以該學生是被歸類在很會游泳 A跟 (B,C) 建立一個超平面
B跟 (A,C)建立一個超平面
C跟 (A,B)建立一個超平面
如何判斷?
先看會游泳的區塊, 沒錯它會游泳
再看很會游泳的區塊, 沒錯它很會游泳
再看不會游泳的區塊, 它不屬於這區塊的,
那這位同學是很會還是指是會游泳呢?
答案是距離超平面距離院遠越好, 越像那一類, 也就是她很會游泳!