Многоклассовая классификация SVM в Encog

может ли кто-нибудь показать мне, как использовать классификацию Multi class SVM в Encog 3.1?

Я использовал их нейронные сети с некоторым успехом, но не могу понять, как настроить многоклассный SVM.

в документах есть это, чтобы сказать:

" это сеть, которая поддерживается одной или несколькими векторными машинами поддержки (SVM). Он предназначен для работы очень похож на нейронную сеть Encog и в значительной степени взаимозаменяем с нейронной сетью Encog..... Классификация используется, когда вы хотите, чтобы SVM группировал входные данные в один или несколько классов. Машины вектора поддержки типично имеют одиночный выход. Нейронные сети могут иметь несколько выходных нейронов. Чтобы обойти эту проблему, этот класс создаст несколько SVM, если указано более одного вывода"

но я не вижу, как указать более одного вывода, на самом деле свойство output просто возвращает 1:

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

ответы на Java или c# значительно оценили

EDIT все еще не может решить эту проблему. Действительно нравится использовать Encog, но ФОРУМ ПОДДЕРЖКИ довольно только с Джеффом Хитоном (автором проекта) сам отвечает, Когда у него есть шанс, поэтому я связываю код проекта и добавляю щедрость в надежде, что кто-то может увидеть, что я, очевидно, отсутствует.

проект: http://heatonresearch.com/

класс SupportVectorMachine в google код: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

2 ответов


извините за медленный ответ. Я решил сделать это FAQ для Encog. Вы можете увидеть FAQ & пример здесь. http://www.heatonresearch.com/faq/5/2

в основном Encog поддерживает multi-class SVM. Вам не нужно несколько выходов, как вы делаете нейронную сеть. Вы просто тренируете его с одним выходом, и этот выход-номер класса, т. е. 0.0, 1.0, 2.0 и т. д.. в зависимости от того, сколько классов у вас есть.

это относится как к Java, так и к C# версии Encog. Я сделал пример в 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");
        }
    }
}

У вас не может быть многоклассового SVM. SVMs можно классифицировать только на два класса. Конечно, есть методы, как использовать их для многоклассовой классификации. Они один против одного и один против всех.

В one-vs-one вы тренируетесь (k * (k-1))/2 SVMs для каждой пары классов. Затем вы позволяете им голосовать, и класс с большинством голосов выигрывает.

в one-vs-all у вас есть только k SVMs и для каждого класса вы тренируете один SVM против остальных классов, и снова вы позволяете им голосовать и выбирать победитель.

Я не знаю, есть ли поддержка one-vs-one и one-vs-all в Encog, вы могли бы написать его сами в худшем случае. Однако, я уверен, что вы смотрите на ту часть кода. Скорее всего, это не будет в реализации SVM.