private void btnLearn_Click(object sender, EventArgs e)
{
if (gridSamples.Rows.Count == 0)
{
MessageBox.Show("Please load or insert some data first.");
return;
}
BindingList<Sequence> samples = database.Samples;
BindingList<String> classes = database.Classes;
double[][] inputs = new double[samples.Count][];
int[] outputs = new int[samples.Count];
for (int i = 0; i < inputs.Length; i++)
{
inputs[i] = samples[i].Input;
outputs[i] = samples[i].Output;
}
// Creates a new learning machine. Please note how the number of inputs is given
// as zero: this means the machine will accept variable-length sequences as input.
//
svm = new MulticlassSupportVectorMachine(inputs: 0,
kernel: new DynamicTimeWarping(2), classes: classes.Count);
// Create the learning algorithm to teach the multiple class classifier
var teacher = new MulticlassSupportVectorLearning(svm, inputs, outputs)
{
// Setup the learning algorithm for each 1x1 subproblem
Algorithm = (machine, classInputs, classOutputs, i, j) =>
new SequentialMinimalOptimization(machine, classInputs, classOutputs)
};
// Run the learning algorithm
double error = teacher.Run();
// Classify all training instances
foreach (var sample in database.Samples)
{
sample.RecognizedAs = svm.Compute(sample.Input);
}
foreach (DataGridViewRow row in gridSamples.Rows)
{
var sample = row.DataBoundItem as Sequence;
row.DefaultCellStyle.BackColor = (sample.RecognizedAs == sample.Output) ?
Color.LightGreen : Color.White;
}
}