Encog中的多类SVM分类

时间:2013-05-24 21:16:42

标签: c# java svm encog

有人能告诉我如何在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#中的答案

编辑仍然无法解决这个问题。真的很享受使用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

2 个答案:

答案 0 :(得分:5)

很抱歉反应迟钝。我决定把它作为Encog的常见问题解答。你可以看到FAQ&amp;这里的例子。 http://www.heatonresearch.com/faq/5/2

基本上Encog DOES支持多类SVM。您不需要像神经网络那样需要多个输出。你只需用一个输出训练它,输出就是类号,即0.0,1.0,2.0等等。取决于你有多少个类。

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Encog.ML.SVM;
using Encog.ML.Data;
using Encog.ML.Data.Basic;
using Encog.ML.Train;
using Encog.ML.SVM.Training;

namespace MultiClassSVM
{
    class Program
    {
        /// 
        /// Input for function, normalized to 0 to 1.
        /// 
        public static double[][] ClassificationInput = {
            new[] {0.0, 0.0},
            new[] {0.1, 0.0},
            new[] {0.2, 0.0},
            new[] {0.3, 0.0},
            new[] {0.4, 0.5},
            new[] {0.5, 0.5},
            new[] {0.6, 0.5},
            new[] {0.7, 0.5},
            new[] {0.8, 0.5},
            new[] {0.9, 0.5}
            };

        /// 
        /// Ideal output, these are class numbers, a total of four classes here (0,1,2,3).
        /// DO NOT USE FRACTIONAL CLASSES (i.e. there is no class 1.5)
        /// 
        public static double[][] ClassificationIdeal = {
            new[] {0.0},
            new[] {0.0},
            new[] {0.0},
            new[] {0.0},
            new[] {1.0},
            new[] {1.0},
            new[] {2.0},
            new[] {2.0},
            new[] {3.0},
            new[] {3.0}
        };

        static void Main(string[] args)
        {
            // create a neural network, without using a factory
            var svm = new SupportVectorMachine(2, false); // 2 input, & false for classification

            // create training data
            IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal);

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

            int epoch = 1;

            do
            {
                train.Iteration();
                Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error);
                epoch++;
            } while (train.Error > 0.01);

            // test the SVM
            Console.WriteLine(@"SVM Results:");
            foreach (IMLDataPair pair in trainingSet)
            {
                IMLData output = svm.Compute(pair.Input);
                Console.WriteLine(pair.Input[0]
                                  + @", actual=" + output[0] + @",ideal=" + pair.Ideal[0]);
            }

            Console.WriteLine("Done");
        }
    }
}

答案 1 :(得分:1)

您不能拥有多类SVM。 SVM只能分为两类。当然有如何将它们用于多类分类的方法。他们是一对一,一对一。

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

在一对一中你只有k个SVM,每个班级你训练一个SVM对抗其余的班级,你再让他们投票并选择胜利者。

我不知道在Encog中是否支持one-vs-one和one-vs-all,你可以在最糟糕的情况下自己编写。但是,我确信您正在查看代码库的错误部分。它很可能不会在SVM的实现中。