private static BiometricResult Evaluate(ClassifierInstance classifier, List <ISample> testingSamples, double minInterval, double interval, BiometricResult result) { if (interval < minInterval) { // the threshold found for the smallest interval represents the best guess at the EER return(result); } else { // recurse until the smallest allowable interval is hit ErrorRatePair delta1 = CalculateErrorRate(classifier, testingSamples, (result.GetThreshold() - (interval / 2.0))); ErrorRatePair delta2 = CalculateErrorRate(classifier, testingSamples, (result.GetThreshold() + (interval / 2.0))); Console.WriteLine("delta1 : " + delta1.GetFAR() + " " + delta1.GetFRR() + " \n " + delta2.GetFAR() + " " + delta2.GetFRR()); Console.WriteLine("threshold: " + result.GetThreshold()); Console.WriteLine("errorDelta1: " + delta1.GetErrorDelta() + " errorDelta2: " + delta2.GetErrorDelta()); if (delta1.GetErrorDelta() < delta2.GetErrorDelta()) { Console.WriteLine("Choose delta1"); return(Evaluate(classifier, testingSamples, minInterval, (interval / 2.0), new BiometricResult((result.GetThreshold() - (interval / 2.0)), new List <ErrorRatePair> { delta1 }))); } else { Console.WriteLine("Choose delta2"); return(Evaluate(classifier, testingSamples, minInterval, (interval / 2.0), new BiometricResult((result.GetThreshold() + (interval / 2.0)), new List <ErrorRatePair> { delta2 }))); } } }
public static ErrorRatePair CalculateErrorRate(ClassifierInstance classifier, List <ISample> testingSamples, double threshold) { Tuple <int, int> farResults = CalculateFAR(classifier, testingSamples, threshold); Tuple <int, int> frrResults = CalculateFRR(classifier, testingSamples, threshold); return(new ErrorRatePair(farResults.Item1, farResults.Item2, frrResults.Item1, frrResults.Item2)); }
private static Tuple <int, int> CalculateFRR(ClassifierInstance classifier, List <ISample> testingSamples, double threshold) { string[] identifiers = classifier.GetTrainedIdentifiers(); // for each identifier find the samples taht incorrectly match the identifier given the threshold VerificationResult result = identifiers.AsParallel().SelectMany(identifier => testingSamples.Where(sample => sample.GetIdentifier().Equals(identifier)).Select(sample => { if (classifier.Verify(sample.GetDimensions(), identifier) <= threshold) { return(new VerificationResult(0, 1)); // falsely rejected sample for the correct identifier } else { return(new VerificationResult(1, 0)); // correctly accepted sample for the identifier } }) ).Aggregate((current, next) => current + next); return(new Tuple <int, int>(result.Rejected, (result.Accepted + result.Rejected))); }
// perform EER evaluation on provided testing samples public static BiometricResult Evaluate(ClassifierInstance classifier, List <ISample> testingSamples, double minInterval = DEFAULT_MIN_INTERVAL) { return(Evaluate(classifier, testingSamples, minInterval, 0.5, new BiometricResult(0.5, null))); }