machine learning - Getting the class label using DynamicTimeWarping using Accord.NET -
i'm developing project in need gesture recognition. after searching way came across dynamic time warping. try idea, , since project in c#, decided try accord.net. before tried out in project, created clean project , modified example on accord.net's documentation, can found here:
http://accord-framework.net/docs/html/t_accord_statistics_kernels_dynamictimewarping.htm
so, i'm trying right now, train algorithm set of learning data (composed of gestures swipe right, swipe left , double tap) , then, use same examples in learning data see if algorithm identifying correct gesture. values exemple, not real deal.
the documentation not clear on how this, since decide method used on example returns boolean. i've searched documentation way identify correct class no avail.
the thing i've found following line, returns int value of 0 or 1, instead of boolean:
var res1 = ((iclassifier)svm.tomulticlass()).decide(sequences[0]);
can point me in right direction on how correctly identify gesture? first attempt @ machine learning , accord.net, absolutelly new me. example code can found bellow.
namespace dynamictimewarpingexample { public class program { public static void main(string[] args) { double[][][] sequences = { new double[][] // swipe left { new double[] { 1, 1, 1 }, new double[] { 1, 2, 1 }, new double[] { 1, 2, 2 }, new double[] { 2, 2, 2 }, }, new double[][] // swipe right { new double[] { 1, 10, 6 }, new double[] { 1, 5, 6 }, new double[] { 6, 7, 1 }, }, new double[][] // double tap { new double[] { 8, 2, 5 }, new double[] { 1, 50, 4 }, } }; int[] outputs = { 0, // swipe left 1, // swipe right 2 // double tap }; var smo = new sequentialminimaloptimization<dynamictimewarping, double[][]>() { complexity = 1.5, kernel = new dynamictimewarping(alpha: 1, degree: 1) }; var svm = smo.learn(sequences, outputs); bool[] predicted = svm.decide(sequences); double error = new zerooneloss(outputs).loss(predicted); // error 0.0 var res1 = ((iclassifier<double[][], int>)svm.tomulticlass()).decide(sequences[0]); // returns 0 var res2 = ((iclassifier<double[][], int>)svm.tomulticlass()).decide(sequences[1]); // returns 1 var res3 = ((iclassifier<double[][], int>)svm.tomulticlass()).decide(sequences[2]); // returns 1 } } } ***************** new version *****************
public static void main(string[] args) { double[][][] sequences = { new double[][] // swipe left { new double[] { 1, 1, 1 }, new double[] { 1, 2, 1 }, new double[] { 1, 2, 2 }, new double[] { 2, 2, 2 }, }, new double[][] // swipe right { new double[] { 1, 10, 6 }, new double[] { 1, 5, 6 }, new double[] { 6, 7, 1 }, }, new double[][] // double tap { new double[] { 8, 2, 5 }, new double[] { 1, 50, 4 }, } }; int[] outputs = { 0, // swipe left 1, // swipe right 2 // double tap }; var teacher = new multiclasssupportvectorlearning<dynamictimewarping, double[][]>() { // configure learning algorithm use smo train // underlying svms in each of binary class subproblems. learner = (param) => new sequentialminimaloptimization<dynamictimewarping, double[][]> { complexity = 1.5, kernel = new dynamictimewarping(alpha: 1, degree: 1), //usekernelestimation = true } }; // learn machine var machine = teacher.learn(sequences, outputs); // create multi-class learning algorithm machine var calibration = new multiclasssupportvectorlearning<dynamictimewarping, double[][]>() { model = machine, // start existing machine // configure learning algorithm use platt's calibration learner = (param) => new probabilisticoutputcalibration<dynamictimewarping, double[][]>() { model = param.model // start existing machine } }; // configure parallel execution options calibration.paralleloptions.maxdegreeofparallelism = 1; // learn machine calibration.learn(sequences, outputs); double decision1, decision2, decision3, decision4, decision5, decision6; var res1 = machine.probability(sequences[0], out decision1); // decision 0 - probability 0.78698604216159851 - score 1 var res2 = machine.probability(sequences[1], out decision2); // decision 1 - probability 0.67246889837875257 - score 1 var res3 = machine.probability(sequences[2], out decision3); // decision 2 - probability 0.78698604216159851 - score 1 var newgesture1 = new double[][] { new double[] { 1, 1, 1 }, new double[] { 1, 2, 1 }, new double[] { 1, 2, 2 }, new double[] { 2, 2, 2 }, }; var newgesture2 = new double[][] { new double[] { 1, 10, 6 }, new double[] { 1, 5, 6 }, new double[] { 6, 7, 1 }, }; var newgesture3 = new double[][] { new double[] { 8, 2, 5 }, new double[] { 1, 50, 4 }, }; var res5 = machine.score(newgesture1, out decision5); // decision 0 - probability 0.35577588944247057 - score 0.051251948605637254 var res6 = machine.score(newgesture2, out decision6); // decision 1 - probability 0.40733908994050544 - score 0.19912250476931792 var res4 = machine.score(newgesture3, out decision4); // decision 2 - probability 0.71853321355842836 - score 0.816934034911964 }
the problem creating binary classifier problem involves multiple classes.
in case, instead of doing:
var smo = new sequentialminimaloptimization<dynamictimewarping, double[][]>() { complexity = 1.5, kernel = new dynamictimewarping(alpha: 1, degree: 1) }; var svm = smo.learn(sequences, outputs); you want wrap binary learning problem multi-class learning using
// create multi-class learning algorithm machine var teacher = new multiclasssupportvectorlearning<dynamictimewarping, double[][]>() { // configure learning algorithm use smo train // underlying svms in each of binary class subproblems. learner = (param) => new sequentialminimaloptimization<dynamictimewarping, double[][]> { complexity = 1.5, kernel = new dynamictimewarping(alpha: 1, degree: 1) }; } // learn machine var svm = teacher.learn(inputs, outputs);
Comments
Post a Comment