/** * Extract statistics from the confusion matrices. */ public ResultT Results() { // aggregate confusion matrix Vector cm = new Vector(0.0, 4); for (int ii = 0; ii < confusion_matrices.Count; ii++) { cm += confusion_matrices[ii]; } ResultT ret = new ResultT(); ret.Recall = cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE]; ret.Recall /= (cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE] + cm[(int)ConfusionMatrixEntry.FALSE_NEGATIVE]); ret.Precision = cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE]; ret.Precision /= (cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE] + cm[(int)ConfusionMatrixEntry.FALSE_POSITIVE]); ret.FallOut = cm[(int)ConfusionMatrixEntry.FALSE_POSITIVE]; ret.FallOut /= (cm[(int)ConfusionMatrixEntry.FALSE_POSITIVE] + cm[(int)ConfusionMatrixEntry.TRUE_NEGATIVE]); ret.F1 = 2.0 * cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE]; ret.F1 /= (2.0 * cm[(int)ConfusionMatrixEntry.TRUE_POSITIVE] + cm[(int)ConfusionMatrixEntry.FALSE_POSITIVE] + cm[(int)ConfusionMatrixEntry.FALSE_NEGATIVE]); return(ret); }
/** * Evaluate all user study sessions for a given device type. */ public static void evaluate_sessions(DeviceType device) { List <ConfusionMatrices> confusion_matrices = new List <ConfusionMatrices>(); int[] participants = get_participant_list(device); for (int i = 0; i < participants.Length - 1; i++) { ConfusionMatrices cm = evaluate_session( device, participants[i]); confusion_matrices.Add(cm); int idx = confusion_matrices.Count - 1; Console.WriteLine("Participant: " + participants[i]); ResultT resultss = confusion_matrices[idx].Results(); resultss.Print(); Console.WriteLine(); } // put all results into first confusion // matrix for (int ii = 1; ii < confusion_matrices.Count; ii++) { confusion_matrices[0].AddResult(confusion_matrices[ii]); } Console.WriteLine("Aggregate results:"); ResultT result = confusion_matrices[0].Results(); result.Print(); Console.WriteLine(); }
/** * A simple user independent test. */ public static void user_indepedent_test(DeviceType device) { // First, load all training data for one device type. string path = ""; if (device == DeviceType.KINECT) { path = Global.GetRootDirectory() + "datasets/jk2017/kinect/training/"; } else if (device == DeviceType.LEAP_MOTION) { path = Global.GetRootDirectory() + "datasets/jk2017/leap_motion/training/"; } Dataset ds = Dataset.LoadDataset(path); int subject_cnt = ds.Subjects.Count; int sample_cnt = ds.Samples.Count; ConfusionMatrices cm = new ConfusionMatrices(ds); // iterate through all subjects for (int subject_id = 0; subject_id < subject_cnt; subject_id++) { ConfusionMatrices cm_individual = new ConfusionMatrices(ds); Console.WriteLine("Participant: " + subject_id); // train a recognizer with the selected subject JackknifeBlades blades = new JackknifeBlades(); blades.SetIPDefaults(); Jackknife jk = new Jackknife(blades); for (int sample_id = 0; sample_id < sample_cnt; sample_id++) { Sample sample = ds.Samples[sample_id]; if (sample.SubjectId != subject_id) { continue; } jk.AddTemplate(ds.Samples[sample_id]); } // only train the recognize if you need // test the recognizer with all other samples for (int sample_id = 0; sample_id < sample_cnt; sample_id++) { Sample sample = ds.Samples[sample_id]; if (sample.SubjectId == subject_id) { continue; } int gid = jk.Classify(sample); cm_individual.AddResult( sample.GestureId, gid); } cm.AddResult(cm_individual); ResultT resultss = cm_individual.Results(); resultss.Print(); } Console.WriteLine("Aggregate Results: "); ResultT results = cm.Results(); results.Print(); }