12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- #! /usr/bin/python
- # -*- encoding: utf-8 -*-
- import numpy
- import torch
- import torch.nn.functional as F
- from sklearn import metrics
- from operator import itemgetter
- def accuracy(output, target, topk=(1,)):
- """Computes the precision@k for the specified values of k"""
- maxk = max(topk)
- batch_size = target.size(0)
- _, pred = output.topk(maxk, 1, True, True)
- pred = pred.t()
- correct = pred.eq(target.view(1, -1).expand_as(pred))
- res = []
- for k in topk:
- correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)
- res.append(correct_k.mul_(100.0 / batch_size))
- return res
- def tuneThresholdfromScore(scores, labels, target_fa, target_fr = None):
-
- fpr, tpr, thresholds = metrics.roc_curve(labels, scores, pos_label=1)
- fnr = 1 - tpr
- tunedThreshold = [];
- if target_fr:
- for tfr in target_fr:
- idx = numpy.nanargmin(numpy.absolute((tfr - fnr)))
- tunedThreshold.append([thresholds[idx], fpr[idx], fnr[idx]]);
-
- for tfa in target_fa:
- idx = numpy.nanargmin(numpy.absolute((tfa - fpr))) # numpy.where(fpr<=tfa)[0][-1]
- tunedThreshold.append([thresholds[idx], fpr[idx], fnr[idx]]);
-
- idxE = numpy.nanargmin(numpy.absolute((fnr - fpr)))
- eer = max(fpr[idxE],fnr[idxE])*100
-
- return (tunedThreshold, eer, fpr, fnr);
|