Классификация С# ENCOG SVM с моим собственным набором данных

Я хотел бы сделать приложение мультиклассовой классификации на С#. Я решил использовать encog для этого. Теперь я застрял в одной точке. Я нашел пример XOR, который я понимаю. Но когда я собираюсь использовать свой собственный набор данных, приложение вычисляет только одну функцию из одного примера. Вот мой код:

 namespace ConsoleApplication1
 {

   public static class Load
   {
       public static double[][] FromFile(string path)
       {
        var rows = new List<double[]>();
        foreach (var line in File.ReadAllLines(path))
        {
            rows.Add(line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray());
        }
        return rows.ToArray();
    }
}

 public class Program
 {

 static void Main( string [ ] args )
 {

 // LOADING MY OWN DATASET
 string cestain = @"E:\vstup.txt";
 double[][] innput = Load.FromFile(cestain);   //Training INPUTS

 string cestaout = @"E:\vystup.txt";
 double[][] ooutput = Load.FromFile(cestaout); //Desired OUTPUTS

 string cestatest = @"E:\te1.txt";
 double[][] teest = Load.FromFile(cestatest);   // Test Example


    // create a neural network 
    var svm = new SupportVectorMachine(10, false); // 2 input, & false for classification


    // create training data
    IMLDataSet trainingSet = new BasicMLDataSet(innput, ooutput);

    // train the neural network
    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 neural network

    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");
    Console.ReadKey();
 }
 }
 } 

INPUTS выглядит так (это всего лишь пример):

166 163 180 228

165 162 160 226

166 163 180 228

166 164 180 228

ЖЕЛАЕМЫЕ ВЫВОДЫ выглядят так (это всего лишь пример):

1

2

1

1

ПРИМЕР ТЕСТА выглядит так:

152 151 98 219

Когда я запускаю свое приложение, оно вычисляет ошибку, но показывает только значения из первого столбца моих ВХОДОВ (поэтому я не уверен, вычисляет ли оно целые примеры - 4 значения). Я также не уверен, как передать мой пример TEST в SVM вместо этой пары.Ввод.

Или есть более эффективный способ сделать это, чем encog? Спасибо.


person user2886091    schedule 18.02.2014    source источник


Ответы (1)


Если вы делаете и оператор xor, вам нужна только пара цифр... но в вашем образце ввода у вас есть четыре, что я не понимаю.

Я не знаю, как использовать SupportVectorMachine, поэтому я использую это:

BasicNetwork network = new BasicNetwork(); 
network.AddLayer(new BasicLayer(2)); //input layer
network.AddLayer(new BasicLayer(2)); //hidden layer
network.AddLayer(new BasicLayer(1)); //ouput layer
network.Structure.FinalizeStructure(); 
network.Reset();

Я хочу, чтобы это помогло.

person Ray Lionfang    schedule 20.02.2014
comment
Я использовал этот xor в качестве шаблона, чтобы понять, как он работает. Эти четыре цифры являются параметрами (такими как высота, ширина и т. д.). Поэтому я не хочу использовать пары. Допустим, я буду использовать BasicNetwork. Если я использую 4 нейрона во входном слое, значит ли это, что он будет обрабатывать весь обучающий пример (эти 4 значения)? А как вы используете свою сеть, когда хотите классифицировать новый, неизвестный пример? Спасибо - person user2886091; 21.02.2014