执行多类 SVM 的最佳方法

机器算法验证 机器学习 matlab 支持向量机 多级
2022-02-09 16:29:40

我知道 SVM 是一个二元分类器。我想将它扩展到多类 SVM。哪种方法是最好的,也许是最简单的方法?

代码:在MATLAB中

   u=unique(TrainLabel); 
    N=length(u); 
    if(N>2)    
        itr=1;    
        classes=0;   
        while((classes~=1)&&(itr<=length(u)))   
            c1=(TrainLabel==u(itr));    
            newClass=double(c1); 
            tst = double((TestLabel == itr));
            model = svmtrain(newClass, TrainVec, '-c 1 -g 0.00154');  
            [predict_label, accuracy, dec_values] = svmpredict(tst, TestVec, model);    
            itr=itr+1;   
        end
        itr=itr-1;
    end

如何改进?

2个回答

多类分类有很多方法。不是特定于 SVM 的两个经典选项是:

  1. One-vs-all (OVA) 分类:
    假设您有 A、B、C 和 D 类。不要进行四向分类,而是训练四个二元分类器:A vs. not-A,B vs. not-B , C vs. not-C, D vs. not-D。然后,选择“最好”的正类(例如,在所有四次运行中距离边缘最远)。如果没有一个分类是正的(即它们都不是-X),则选择最差的类的“相反”(例如,最接近边缘)。

  2. All-vs-All:
    训练所有可能的分类对。按某些因素(例如,选择的次数)对类进行排名,然后选择最好的。

哪种方法效果最好一直存在争议: Duan 和 Keerthi进行了一项实证研究,提出了一种特定的 all-vs-all 方法,而Rifkin 和 Klautau则主张采用 one-vs-all 方案。甚至有一些方案可以学习描述类标签的纠错码,而不是标签本身。

祝你好运!

编辑:你真正想要的,特别是对于 OVA,是每个类的后验概率。对于某些方法,例如朴素贝叶斯,这是微不足道的。SVM 通常不会给您概率,但有一些方法可以计算它们。请参阅 John Platt 1999 年的论文“支持向量机的概率输出...”

让我补充一点,将 SVM 扩展到多个类(与 Matt Krause 描述的分解为多个二进制分类任务的方法相反)。一项重要的工作是:基于多类核向量机的算法实现