svm本身是乙個二值分類器
svm演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。
目前,構造svm多類分類器的方法主要有兩類
(1)直接法,直接在目標函式上進行修改,將多個分類面的引數求解合併到乙個最優化問題中,通過求解該最優化問題「一次性」實現多類分類。這種方法看似簡單,但其計算複雜度比較高,實現起來比較困難,只適合用於小型問題中;
(2)間接法,主要是通過組合多個二分類器來實現多分類器的構造,常見的方法有one-against-one和one-against-all兩種。
一對多法(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)。
於是最終的結果便是這四個值中最大的乙個作為分類結果。
評價:這種方法有種缺陷,因為訓練集是1:m,這種情況下存在biased.因而不是很實用。可以在抽取資料集的時候,從完整的負集中再抽取三分之一作為訓練負集。
一對一法(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,代價還是相當大的。
層次支援向量機
層次分類法首先將所有類別分成兩個子類,再將子類進一步劃分成兩個次級子類,如此迴圈,直到得到乙個單獨的類別為止。
對層次支援向量機的詳細說明可以參考**《支援向量機在多類分類問題中的推廣》(劉志剛,計算機工程與應用,2004)
**:
支援向量機SVM 實現多分類問題的解決方案
總結眾所周知,支援向量機svm是機器學習中典型的二值分類演算法。但現實生活中,有很多實際應用是沒有辦法用簡單的二值分類器去完成分類的。因此,為了拓展支援向量機svm的應用場景,必須考慮在多分類情況下的演算法實現。原本應用在二值分類上的svm演算法是否可以應用在多分類問題上呢?答案是肯定的。通過重新構...
Jar Hell 問題解決方案
最近看到溫紹錦的jvm基礎,裡面看到這個jar hell問題的解決方法,之前遇到過一次,是乙個資源檔案,當時覺得挺麻煩,不知道還有這個方法,很棒,特地整理了下,記錄到這裡來,這個部落格開了好長時間了,一直以來也懶得寫東西,以後會堅持更新些。classloader classloader thread...
top K問題解決方案
1.使用最大最小堆。求最大的數用最小堆,求最小的數用最大堆。2.quick select演算法。使用類似快排的思路,根據pivot劃分陣列。3.使用排序方法,排序後再尋找top k元素。4.使用選擇排序的思想,對前k個元素部分排序。5.將1000 個數分成m組,每組尋找top k個數,得到m k個數...