使用Accord.NET使用DynamicTimeWarping获取类标签

时间:2017-04-06 13:24:36

标签: machine-learning accord.net

我正在开发一个我需要做手势识别的项目。 在寻找一种方法来做到这一点后,我遇到了动态时间扭曲。 为了尝试这个想法,并且由于我的项目是在C#中,我决定尝试使用Accord.NET。 在我的项目中尝试这个之前,我创建了一个干净的项目并修改了Accord.NET文档中的示例,可以在这里找到:

http://accord-framework.net/docs/html/T_Accord_Statistics_Kernels_DynamicTimeWarping.htm

所以,我现在正在尝试的是,用一组学习数据训练我的算法(由手势向右滑动,向左滑动和双击)然后,在学习中使用相同的例子数据以查看算法是否正在识别正确的手势。价值只是一个例子,而不是真正的交易。

关于如何执行此操作的文档不是很清楚,因为示例中使用的Decide方法仅返回布尔值。 我已经在文档中搜索了一种识别正确类的方法但无济于事。

我唯一发现的是以下行,但它返回的是int值0或1,而不是布尔值:

var res1 =((IClassifier)svm.ToMulticlass())。决定(序列[0]);

有人能指出我正确方向如何正确识别手势吗? 这是我第一次尝试机器学习和Accord.NET,所以这对我来说绝对是新手。 示例代码可以在下面找到。

source <script>

*****************新版本*****************

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 will be 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
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题是您正在为实际涉及多个类的问题创建二进制分类器。

在您的情况下,而不是:

var smo = new SequentialMinimalOptimization<DynamicTimeWarping, double[][]>()      
{
    Complexity = 1.5,
    Kernel = new DynamicTimeWarping(alpha: 1, degree: 1)
};

var svm = smo.Learn(sequences, outputs);

您可能希望使用

将此二进制学习问题包装成多类学习
// Create the multi-class learning algorithm for the machine
var teacher = new MulticlassSupportVectorLearning<DynamicTimeWarping, double[][]>()
{
    // Configure the learning algorithm to use SMO to train the
    //  underlying SVMs in each of the binary class subproblems.
    Learner = (param) => new SequentialMinimalOptimization<DynamicTimeWarping, double[][]>
    {
        Complexity = 1.5,
        Kernel = new DynamicTimeWarping(alpha: 1, degree: 1)
    };
}

// Learn a  machine
var svm = teacher.Learn(inputs, outputs);