Search code examples
c#.netmachine-learningsvmaccord.net

Accord.Net Multiclass SVM DynamicTimeWarping Exception


I want to combine dynamic time warping and svm to use as a classifier. I use Accord .net, but there is something wrong with my code,here is my code:

        double[][] inputs = new double[100][];
        for(int i = 0; i < linesX.Length; i++)
        {
            inputs[i] = Array.ConvertAll(linesX[i].Split(','), Double.Parse);
        }
        int[] outputs = Array.ConvertAll(linesY, s => int.Parse(s));     

        // Create the Sequential Minimal Optimization learning algorithm
        var smo = new MulticlassSupportVectorLearning<DynamicTimeWarping>()
        {
            // Set the parameters of the kernel
            Kernel = new DynamicTimeWarping(alpha: 1, degree: 1)
        };

        // And use it to learn a machine!
        var svm = smo.Learn(inputs, outputs);

        // Now we can compute predicted values
        int[] predicted = svm.Decide(inputs);

        // And check how far we are from the expected values
        double error = new ZeroOneLoss(outputs).Loss(predicted); 

My inputs are (100,800), outputs are (100,1), there will be an exception at this line:var svm = smo.Learn(inputs, outputs);The exception is “System.AggregateException” happens in Accord.MachineLearning.dllWhat's wrong with my code


Solution

  • Please refer to the correct setup HERE. You're not assigning the Learner property.

    Here's your modified code with some random input data:

        static void Main(string[] args)
        {
            Random r = new Random();
    
            double[][] inputs = new double[10][];
            int[] outputs = new int[10];
    
            for (int i = 0; i < 10; i++)
            {
                inputs[i] = new double[8];
                for (int j = 0; j < 8; j++)
                {
                    inputs[i][j] = r.Next(1, 100);
                }
                outputs[i] = r.Next(1, 6);
            }
    
            var smo = new MulticlassSupportVectorLearning<DynamicTimeWarping>()
            {
                Learner = (param) => new SequentialMinimalOptimization<DynamicTimeWarping>()
                {
                    Kernel = new DynamicTimeWarping(alpha: 1, degree: 1),
                }
            };
    
            var svm = smo.Learn(inputs, outputs);
    
            int[] predicted = svm.Decide(inputs);
    
            double error = new ZeroOneLoss(outputs).Loss(predicted);
    
            Console.WriteLine();
            Console.WriteLine("output = \n{0}", Matrix.ToString(outputs));
            Console.WriteLine();
            Console.WriteLine("predicted = \n{0}", Matrix.ToString(predicted));
            Console.WriteLine();
            Console.WriteLine("error = {0}", error);
            Console.ReadLine();
        }
    

    Which will produce something like this:

    output =
    2 3 1 2 1 2 2 3 5 1
    
    predicted =
    2 1 1 2 1 2 2 2 2 1
    
    error = 0.3