我正在开发一个我需要做手势识别的项目。 在寻找一种方法来做到这一点后,我遇到了动态时间扭曲。 为了尝试这个想法,并且由于我的项目是在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
}
}
}
答案 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);