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類方式,最後建立物件是因為會是三個不同的執行緒物件,所以