2013-05-24 11 views
5

Qualcuno potrebbe mostrarmi come utilizzare la classificazione SVM multi classe in Encog 3.1?Classificazione SVM multiclasse in Encog

Ho usato le loro reti neurali con un certo successo, ma non riesco a capire come impostare un SVM multiclasse.

La documentazione hanno questo da dire:.

"Si tratta di una rete che è sostenuta da uno o più Support Vector Machines (SVM) È stato progettato per funzionare in modo molto simile a una rete neurale Encog, ed è in gran parte intercambiabile con una rete neurale di Encog ..... La classificazione viene utilizzata quando si desidera che SVM raggruppi i dati di input in una o più classi Supporto delle macchine In genere le macchine hanno un'unica uscita Le reti neurali possono avere più neuroni di uscita. questo problema, questa classe creerà SVM multipli se è specificato più di un output "

Tuttavia non riesco a vedere come specificare più di un output, infatti la proprietà di output semplicemente restituisce 1:

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

risposte in Java o C# sono molto apprezzate

EDIT ancora in grado di lavorare questo fuori. Mi piace davvero usare Encog, ma il forum di supporto è abbastanza solo con Jeff Heaton (autore del progetto) a rispondere quando ha una possibilità, quindi im collegare il codice del progetto e aggiungere una taglia nella speranza che qualcuno possa vedere ciò che evidentemente manca.

Il progetto: http://heatonresearch.com/

La classe SupportVectorMachine su Google Code: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

risposta

4

Ci scusiamo per la risposta lenta. Ho deciso di renderlo una FAQ per Encog. Puoi vedere l'esempio delle FAQ & qui. http://www.heatonresearch.com/faq/5/2

Fondamentalmente Encog supporta SVM multi-classe. Non hai bisogno di più uscite come fai una rete neurale. Semplicemente lo si allena con una singola uscita e quell'uscita è il numero della classe, cioè 0.0, 1.0, 2.0, ecc. A seconda di quante classi si hanno.

Questo vale per entrambe le versioni di Encog Java e C#. Ho fatto l'esempio in 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

Grande, grazie per aver risposto, non so perché non ho pensato di provarlo. Trovare Encog è davvero molto utile. – Steve

+0

Non stai usando solo la regressione per la classificazione? http://stackoverflow.com/questions/9160669/why-is-it-not-to-approach-classification-through-regression –

+0

D'accordo, è male usare la regressione per fare la classificazione, ma questo non è il caso qui. In Encog un SVM è designato come regressione o classificazione nel costruttore. Queste sono due configurazioni molto diverse per SVM. Si noti che il costruttore ha un valore falso, il che significa che è una classificazione. Pertanto, i valori di 1.0, 2.0 ecc. Sono numeri di classe. Utilizza sempre un input in virgola mobile per coerenza. – JeffHeaton

1

Non si può avere SVM multiclasse. Gli SVM possono essere classificati solo in due classi. Ci sono naturalmente metodi su come usarli per la classificazione multiclasse. Sono uno contro uno e uno contro tutti.

In one-vs-one ci si allena (k * (k-1))/2 SVM per ogni coppia di classi. Poi li lasci votare e la classe con più voti vince.

In uno contro tutti si hanno solo SVM e per ogni classe si prepara un SVM contro il resto delle classi e di nuovo si lascia votare e si sceglie il vincitore.

Non so se esiste un supporto per one-vs-one e one-vs-all in Encog, è possibile scrivere da soli nel peggiore dei casi. Tuttavia, sono sicuro che stai guardando la parte sbagliata del codebase. Molto probabilmente non sarà nell'implementazione di SVM.

+0

Grazie per la risposta, posso finire di scrivere il mio implementazione o semplicemente tornare ad usare Accord NET, ma sono sicuro che ci deve essere il supporto per questo integrato in Encog.La documentazione che ho evidenziato ci suggerisce certamente. – Steve