Encog中的多类SVM分类

Posted

技术标签:

【中文标题】Encog中的多类SVM分类【英文标题】:Multiclass SVM Classification in Encog 【发布时间】:2013-05-20 13:47:20 【问题描述】:

有人可以告诉我如何在 Encog 3.1 中使用多类 SVM 分类吗?

我已经成功使用了他们的神经网络,但不知道如何设置多类 SVM。

文档是这样说的:

“这是一个由一个或多个支持向量机 (SVM) 支持的网络。它的功能与 Encog 神经网络非常相似,并且在很大程度上可与 Encog 神经网络互换.....分类当您希望 SVM 将输入数据分组到一个或多个类时使用。支持向量机通常有一个输出。神经网络可以有多个输出神经元。为了解决这个问题,如果有,这个类将创建多个 SVM指定了多个输出”

但我看不到如何指定多个输出,实际上输出属性只是返回 1:

 /// <value>For a SVM, the output count is always one.</value>
    public int OutputCount
    
        get  return 1; 
    

非常感谢 Java 或 c# 中的答案

EDIT 仍然无法解决这个问题。真的很喜欢使用 Encog,但是支持论坛上只有 Jeff Heaton(项目的作者)有机会自己回答,所以我链接了项目代码并添加了赏金,希望有人能看到我明显缺少的东西。

项目: http://heatonresearch.com/

Google 代码上的 SupportVectorMachine 类: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

【问题讨论】:

【参考方案1】:

抱歉回复慢。我决定将此作为 Encog 的常见问题解答。您可以在此处查看常见问题解答和示例。 http://www.heatonresearch.com/faq/5/2

Encog 基本上支持多类 SVM。你不需要像神经网络那样的多个输出。您只需使用单个输出对其进行训练,该输出就是类号,即 0.0、1.0、2.0 等。取决于您有多少类。

这适用于 Encog 的 Java 和 C# 版本。我在 C# 中做了示例。

使用系统;
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Text;
使用 Encog.ML.SVM;
使用 Encog.ML.Data;
使用 Encog.ML.Data.Basic;
使用 Encog.ML.Train;
使用 Encog.ML.SVM.Training;

命名空间 MultiClassSVM

    课堂节目
    
        ///
        /// 函数的输入,归一化为 0 到 1。
        ///
        公共静态双[][]分类输入= 
            新[] 0.0, 0.0,
            新[] 0.1, 0.0,
            新[] 0.2, 0.0,
            新[] 0.3, 0.0,
            新[] 0.4, 0.5,
            新[] 0.5, 0.5,
            新[] 0.6, 0.5,
            新[] 0.7, 0.5,
            新[] 0.8, 0.5,
            新[] 0.9, 0.5
            ;

        ///
        /// 理想输出,这些是类号,这里一共四个类(0,1,2,3)。
        /// 不要使用分数类(即没有类 1.5)
        ///
        public static double[][] ClassificationIdeal = 
            新[] 0.0,
            新[] 0.0,
            新[] 0.0,
            新[] 0.0,
            新[] 1.0,
            新[] 1.0,
            新[] 2.0,
            新[] 2.0,
            新[] 3.0,
            新[] 3.0
        ;

        静态无效主要(字符串 [] 参数)
        
            // 创建一个神经网络,不使用工厂
            var svm = new SupportVectorMachine(2, false); // 2 个输入,& false 用于分类

            // 创建训练数据
            IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal);

            // 训练 SVM
            IMLTrain train = new SVMSearchTrain(svm, trainingSet);

            整数时代 = 1;

            做
            
                train.Iteration();
                Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error);
                纪元++;
             while (train.Error > 0.01);

            // 测试 SVM
            Console.WriteLine(@"SVM 结果:");
            foreach(训练集中的 IMLDataPair 对)
            
                IMLData 输出 = svm.Compute(pair.Input);
                Console.WriteLine(pair.Input[0]
                                  + @", 实际=" + 输出[0] + @",ideal=" + pair.Ideal[0]);
            

            Console.WriteLine("完成");
        
    

【讨论】:

太好了,感谢您的回复,不知道为什么我没想过尝试。发现 Encog 确实非常有用。 你不就是用回归来分类的吗? ***.com/questions/9160669/… 同意,使用回归做分类不好,但这里不是这样。在 Encog 中,SVM 在构造函数中被指定为回归或分类。这是 SVM 的两种非常不同的设置。注意构造函数有一个假值,这意味着它是分类。因此,1.0、2.0 等的值是类号。它总是使用浮点输入来保持一致性。 @JeffHeaton 你知道如何规范化 0, 1 范围内的数据吗?是否有任何内置功能或可以这样做的东西? ...最后一个问题如何控制内核类型 en encog? 好的,杰夫,但您应该精确地突出显示 - SVM 仅适用于 (0,1) 范围内的 NORMALIZED 值【参考方案2】:

您不能拥有多类 SVM。 SVM 只能分为两类。当然,有一些方法可以将它们用于多类分类。它们是一对一和一对一的。

在一对一中,您为每对类训练 (k * (k-1))/2 个 SVM。然后你让他们投票,得票最多的班级获胜。

在 one-vs-all 中,您只有 k 个 SVM,对于每个班级,您针对其余班级训练一个 SVM,然后再次让他们投票并选择获胜者。

我不知道Encog是否支持一对一和一对一,最坏的情况你可以自己写。但是,我确信您正在查看代码库的错误部分。它很可能不会出现在 SVM 的实现中。

【讨论】:

感谢您的回答,我最终可能会编写自己的实现,或者只是回到使用 Accord NET,但我确信 Encog 中必须支持此功能。我强调的文档肯定暗示了这一点。

以上是关于Encog中的多类SVM分类的主要内容,如果未能解决你的问题,请参考以下文章

matlab中用svm如何做多类别分类(R2013a)?

SVM+二分类+多分类

SVM实现多分类的三种方案

使用 LIBSVM 的多类

调整 SVM OVO 和 OVA 中的超参数以进行多类分类

用于多类分类的 SVM(one-vs-all)中的置信度估计