2013-05-24 2 views
5

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

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

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

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

Но я не вижу, как указать более одного вывода, ведь свойство вывода просто возвращает 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 Code: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

ответ

4

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

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

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

Отлично, спасибо, что ответили, не знаю, почему я не думал об этом. Найти Encog очень полезно. – Steve

+0

Разве вы не используете регрессию для классификации? http://stackoverflow.com/questions/9160669/why-is-it-not-to-approach-classification-through-regression –

+0

Согласен, плохо использовать регрессию для классификации, но это не так. В Encog SVM обозначается как регрессия или классификация в конструкторе. Это две очень разные настройки для SVM. Обратите внимание, что конструктор имеет ложное значение, это означает, что он является классификацией. Поэтому значения 1.0, 2.0 и т.д. - это номера классов. Он всегда использует ввод с плавающей запятой для согласованности. – JeffHeaton

1

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

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

В одном случае у вас есть только k SVM, и для каждого класса вы тренируете один SVM против остальных классов, и снова вы позволяете им голосовать и выбирать победителя.

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

+0

Спасибо за ваш ответ, я могу написать свою собственную реализацию или просто вернуться к использованию Accord NET, но я уверен, что для этого встроена в Encog.В документах, которые я выделил, определенно намекает на это. – Steve