1. 程式人生 > >SVM多分類的兩種方式

SVM多分類的兩種方式

       SVM本身是一個二值分類器,SVM演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。 目前,構造SVM多類分類器的方法主要有兩類,直接法、間接法。

一 直接法  

    直接在目標函式上進行修改,將多個分類面的引數求解合併到一個最優化問題中,通過求解該最優化問題“一次性”實現多類分類。這種方法看似簡單,但其計算複雜度比較高,實現起來比較困難只適合用於小型問題中;

二 間接法

   主要是通過組合多個二分類器來實現多分類器的構造,常見的方法有one-against-one和one-against-all兩種。

(1)一對多法(one-versus-rest,簡稱OVR SVMs)

   訓練時依次把某個類別的樣本歸為一類,其他剩餘的樣本歸為另一類,這樣k個類別的樣本就構造出了k個SVM。分類時將未知樣本分類為具有最大分類函式值的那類。

  假如我有四類要劃分(也就是4個Label),他們是A、B、C、D。

  於是我在抽取訓練集的時候,分別抽取

  (1)A所對應的向量作為正集,B,C,D所對應的向量作為負集;

  (2)B所對應的向量作為正集,A,C,D所對應的向量作為負集;

  (3)C所對應的向量作為正集,A,B,D所對應的向量作為負集;

  (4)D所對應的向量作為正集,A,B,C所對應的向量作為負集;

  使用這四個訓練集分別進行訓練,然後的得到四個訓練結果檔案。

  在測試的時候,把對應的測試向量分別利用這四個訓練結果檔案進行測試。

  最後每個測試都有一個結果f1(x),f2(x),f3(x),f4(x)。

  於是最終的結果便是這四個值中最大的一個作為分類結果。

評價

優點:訓練k個分類器,個數較少,其分類速度相對較快。

 缺點:

  ①每個分類器的訓練都是將全部的樣本作為訓練樣本,這樣在求解二次規劃問題時,訓練速度會隨著訓練樣本的數量的增加而急劇減慢

  ②同時由於負類樣本的資料要遠遠大於正類樣本的資料,從而出現了樣本不對稱的情況,且這種情況隨著訓練資料的增加而趨向嚴重。解決不對稱的問題可以引入不同的懲罰因子,對樣本點來說較少的正類採用較大的懲罰因子C

  ③還有就是當有新的類別加進來時,需要對所有的模型進行重新訓練

從“一對多”的方法又衍生出基於決策樹的分類:

      

      首先將所有類別分為兩個類別,再將子類進一步劃分為兩個次級子類,如此迴圈下去,直到所有的節點都只包含一個單獨的類別為止,此節點也是二叉樹樹種的葉子。該分類將原有的分類問題同樣分解成了一系列的兩類分類問題,其中兩個子類間的分類函式採用SVM。下圖引用出自於王正海《基於決策樹多分類支援向量機巖性波譜分類》

 

(2)一對一法(one-versus-one,簡稱OVO SVMs或者pairwise)

     其做法是在任意兩類樣本之間設計一個SVM,因此k個類別的樣本就需要設計k(k-1)/2個SVM。

  當對一個未知樣本進行分類時,最後得票最多的類別即為該未知樣本的類別。

  Libsvm中的多類分類就是根據這個方法實現的。

  假設有四類A,B,C,D四類。在訓練的時候我選擇A,B; A,C; A,D; B,C; B,D;C,D所對應的向量作為訓練集,然後得到六個訓練結果,在測試的時候,把對應的向量分別對六個結果進行測試,然後採取投票形式,最後得到一組結果。

  投票是這樣的:
  A=B=C=D=0;
  (A,B)-classifier 如果是A win,則A=A+1;otherwise,B=B+1;
  (A,C)-classifier 如果是A win,則A=A+1;otherwise, C=C+1;
  ...
  (C,D)-classifier 如果是A win,則C=C+1;otherwise,D=D+1;
  The decision is the Max(A,B,C,D)

評價:這種方法雖然好,但是當類別很多的時候,model的個數是n*(n-1)/2,代價還是相當大的。

 評價:

優點:不需要重新訓練所有的SVM,只需要重新訓練和增加語音樣本相關的分類器在訓練單個模型時,相對速度較快

缺點:所需構造和測試的二值分類器的數量關於k成二次函式增長總訓練時間和測試時間相對較慢

  從“一對一”的方式出發,出現了有向無環圖(DirectedAcyclic Graph)的分類方法。


圖1 有向無環圖

        直接方法儘管看起來簡潔,但是在最優化問題求解過程中的變數遠遠多於第一類方法,訓練速度不及間接方法,而且在分類精度上也不佔優。當訓練樣本數非常大時,這一問題更加突出。正因如此,間接方法更為常用。

相關推薦

SVM分類方式

       SVM本身是一個二值分類器,SVM演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。 目前,構造SVM多類分類器的方法主要有兩類,直接法、間接法。一 直接法      直接在目標函式上進行修改,將多個分類面的引數求解合併到一個最優化

java基礎——java類復用的方式

br0 tm4 rss java 復用 ref lan 兩種 vpx Ik2L卮F3w8仄http://t.docin.com/zdto79252 釋7心ND綠誆3叢毯顧http://t.docin.com/wmmo108 欽uvPX勸盜TJZ口http://t.doc

創建線程的方式

nts system main getname 共享 gpo name xtend class 一、繼承Thread,並重寫run方法,使用start方法創建線程。創建四個線程會有四個資源同時進行,如下面例子。 public class MyThread extends

Java中實現線程的方式

窗口 -- his 面向對象 new thread 資源 pub string /** * 使用Thread類模擬4個售票窗口共同賣100張火車票的程序 * * 沒有共享數據,每個線程各賣100張火車票 * * @author jiqinlin * */pu

實現線程的方式

out 兩種 sta main AD style HR 而是 實現 1.繼承Thread類。 源碼結構:public class Thread implements Runnable 從中可以看出Thread類實現了Runnable,由於java中不支持多繼承,所以實現多線

操作系統,編程語言分類,執行python方式,變量,內存管理,定義變量的三個特征

什麽 height 取代 沒有 一個 Coding 開發 軟件 簡單 操作系統 1、什麽是操作系統 操作系統位於計算機硬件與應用軟件之間 是一個協調、管理、控制計算機硬件資源與軟件資源的控制程序2、為何要有操作系統? 1、控制硬件 2、把對硬件的復雜

Java線程Thread使用匿名內部類創建的方式

[] thread sys thread類 main 構造 nbsp ide current 匿名內部類實現線程的兩種方式: 第一種方式: 1.繼承Thread類 2.重寫run方法 3.將要執行的代碼寫在run方法中 第二種方式: 1.將Runnable的

php實現無限級分類方式

@param HP 獲取 velt 分類 get gets key turn 一、梯式: 代碼: /* @desc:獲取梯式分類 @param data 需要轉換的數據 @param pkey 上級的鍵名 @param key 主鍵名 @param pid 頂級id @p

python並發編程:線程-開啟線程的方式

utf-8 data NPU pre int thread pro reading class 一 threading模塊介紹 multiprocess模塊完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性 二 開啟線程的兩種方式 方式一 f

C語言中存儲個字符串的方式

空間 clas 字符串 bubuko spa eight 驗證 std 技術分享 C語言中存儲多個字符串的兩種方式 方式一 二維字符串數組 聲明: char name[4][10] = { "Justinian", "Momo", "Becky", "Bush" }

java實現線程的方式

vat nts lock name div print 創建對象 pre thread Java需要並發控制三個原因: 多線程環境 存在共享資源 多個線程操作(修改)共享資源 下面分別用繼承Thread類和實現Runnable接口倆種方式實現並發控制, 繼承Thread

multiprocessing進程(31-04)創建進程的方式

pen 一個 process 創建進程 __main__ ack 執行 ctime 統一 一個進程可以寄生多個線程。 CPU核數與進程個數是統一的, 若進程多於核數,那麽只有等待上一進程執行完才能被執行。 ------------------第一種進程創建方式-----

實現線程的方式,賣票場景,親測可用

fig his nts conf desc end scrip thread tar 寫在開始 賣票場景:   多線程共同賣票,總票數在多個賣票窗口共享 實現方式:   1繼承Thread類;   2實現Runnable接口 正文開始 方式1 Thread繼承 packa

python執行緒———2、建立執行緒的方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

Python工(2.執行緒(建立執行緒的方式))

Python中threading模組 可以總結出:    (1)當呼叫Thread的時候,不會建立執行緒 (2)呼叫Thread創建出來的例項物件的start方法的時候,才會建立執行緒以及讓這個執行緒開始執行      

fastDFS+LibreOffice檔案上傳(二)後端部分:檔案資訊轉json字串儲存資料庫(Gson和org.json方式)

需要注意的地方: 1)如果你複製我的程式碼到你的程式上報錯,可以看看我第一篇文章實體類跟配置檔案的設定:https://blog.csdn.net/qq_36688143/article/details/84162924 第二篇檔案上傳前端頁面的程式碼: https://blog.c

java:執行緒(匿名內部類實現執行緒的方式)

public class Demo4_Thread { public static void main(String[] args) { new Thread() {//1.繼承Thread類 public void run() {//2.重寫run方法 for(int i

python中執行緒開啟的方式(內含有event的應用,即安全的機制,類似於java的等待喚醒機制,不會出現個執行緒之間的錯亂問題)

 event是類似於java中的等待喚醒機制,具體方法參照上一篇CSDN 下面來介紹開啟執行緒的第一種方式 #Filename:threading1.py #開啟執行緒的第一種方式 import threading import time event=threadin

PHP實現無限極分類方式,遞迴和引用

https://blog.csdn.net/falcom_fans/article/details/75579663 說到無限極分類,比較常見的做法是在建表的時候,增加一個PID欄位用來區別自己所屬的分類   由於展示資料的時候,需要表達出這種所屬關係,所以必然要在讀取資料

java實現執行緒的方式

Java需要併發控制三個原因: 多執行緒環境 存在共享資源 多個執行緒操作(修改)共享資源 下面分別用繼承Thread類和實現Runnable介面倆種方式實現併發控制, 繼承Thread類 繼承Thread類方式,最後建立物件是因為會是三個不同的執行緒物件,所以