错误接受率 (FAR), 错误拒绝率(FRR), 等错误率(EER)代码简易实现

一、FAR FRR

计算方式一:

1、错误接受率 (FAR-False Acceptance Rate)
      FAR = nontarget_is_target / ( target_is_target + nontarget_is_target )
2、错误拒绝率 (FRR-False Rejection Rate)
      FRR = target_is_nontarget / ( target_is_nontarget + nontarget_is_nontarget )

计算方式二: 

1、错误接受率 (FAR)
      FAR = NFA / NIRA                                  NFA:错误接受次数。
                                                                     NIRA:类间测试次数,既不同类别间的测试次数。        假定已有1000个模型,有1000人需识别,且每人只有一个识别素材,则 NIRA=1000*(1000-1) 。
2、错误拒绝率 (FRR)
      FRR = NFR / NGRA                               NFR:错误拒绝次数。
                                                                     NGRA:类内测试次数,既同类别内的测试次数。       假定已有1000个模型,有1000人需识别,且每人只有一个识别素材,则NGRA=1000,如果每人有N个素材,则NGRA=N*1000 。

二、等错误率 (EER-Equal Error Rate) 

EER为错误接受率、错误拒绝率相等时的值。
取一组0到1之间的等差数列,分别作为识别模型的阈值,即坐标x轴,画出FFR和FAR的坐标图,交点为EER值。

三、简易程序实现

假定可以得到用户与不同模型间的相似度,每个用户训练一个模型,提供两个素材用于验证,如下图:

  按计算方式1代码:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sys


data = pd.read_csv('score.csv',header=None)  # 随机数据写入csv文件
user_id_length = len(data.values[0, 1:])  # 用户模型数
test_id_length = len(data.values[1:, 0])  # 待识别素材数
print(data.values)

#错误接受率,错误接受的除以所有接受的
def get_far(nontarget_is_target,target_is_target):
    far = nontarget_is_target/(nontarget_is_target+target_is_target)
    return(far)

#错误拒绝率,错误拒绝的除以所有拒绝的
def get_frr(target_is_nontarget,nontarget_is_nontarget):
    frr = target_is_nontarget/(target_is_nontarget+nontarget_is_nontarget)
    return(frr)

thresholds= np.arange(0.1, 0.9, 0.01)
print('thresholds:',thresholds)

scores = []
EER = 0
for t in thresholds:
    t_t = 0
    t_nt = 0
    nt_t = 0
    nt_nt = 0
    lt_pt = lf_pt = lt_pf = lt_pt = 0
    for i in range(test_id_length):
        for j in range(user_id_length):
        #if data.values[i + 1][0].split('_')[1] == data.values[0][j + 1].split('_')[-1]:
            #print(data.values[i + 1][0], data.values[0][j + 1],data.values[i+1][j+1])
            pre = float(data.values[i+1][j+1])
            test_id = data.values[i+1][0].split('_')[1]
            user_id = data.values[0][j+1].split('_')[-1]
            print(test_id,user_id,pre)
         
            if test_id == user_id:
                if pre > t:
                    t_t +=1                    
                else:
                    t_nt +=1
            else:
                if pre > t:
                    nt_t +=1
                else:
                    nt_nt +=1
            print(t_t,t_nt,nt_t,nt_nt)
    ##### 效果一     
    far = get_far(nt_t,t_t)
    frr = get_frr(t_nt,nt_nt)
    ##### 效果二
    # far = get_far(nt_t, nt_nt)
    # frr = get_frr(t_nt, t_t)
    scores.append([t,far,frr,abs(far-frr)])
    if abs(far-frr) < 0.02:
        EER = abs(far+frr)/2
scores = np.array(scores)
print(scores,'\n----------------')
print('EER is: ', EER)

plt.plot(scores[:,0],scores[:,1],label='FAR')
plt.plot(scores[:,0],scores[:,2],label='FRR')
# plt.plot(scores[:,0],scores[:,3])
plt.grid(True)
plt.legend(bbox_to_anchor=(1.0, 1), loc=1, borderaxespad=0.)
plt.show()

 运行效果一:    

运行效果二:

按计算方式2代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sys
from scipy.interpolate import make_interp_spline


class_in = []  # 类内相似度列表
class_each = []  # 类间相似度列表

data = pd.read_csv('score.csv',header=None)  # 随机数据写入csv文件
user_id_length = len(data.values[0, 1:])  # 用户模型数量
test_id_length = len(data.values[1:, 0])  # 待识别素材数量

for i in range(test_id_length):
    for j in range(user_id_length):
      # print(data.values[i + 1][0], data.values[0][j + 1],data.values[i+1][j+1])
        # 类内测试
        if data.values[i + 1][0].split('_')[1] == data.values[0][j + 1].split('_')[-1]:
            class_in.append(float(data.values[i + 1][j + 1]))
        # 类间测试
        else:
            class_each.append(float(data.values[i + 1][j + 1]))
print(class_in)
print(class_each)

FRR = []
FAR = []

thresld = np.arange(0.1, 0.9, 0.01)  # 阈值等差列表
eer = 1
for i in range(len(thresld)):
    frr = np.sum(class_in < thresld[i]) / len(class_in)
    FRR.append(frr)
    far = np.sum(class_each > thresld[i]) / len(class_each)
    FAR.append(far)
    if (abs(frr - far) < 0.02):  # frr和far值差值很小时认为相等
        eer = abs(frr + far) / 2

##### 平滑曲线图
# x_smooth = np.linspace(thresld.min(),thresld.max(),1000)
# FRR_smooth = make_interp_spline(thresld,FRR)(x_smooth)
# FAR_smooth = make_interp_spline(thresld,FAR)(x_smooth)
# plt.plot(x_smooth, FRR_smooth, '-', label='FRR')
# plt.plot(x_smooth, FAR_smooth, '-.', label='FAR')
print('EER is: ', eer)
plt.plot(thresld, FRR, '-', label='FRR')
plt.plot(thresld, FAR, '-.', label='FAR')
plt.grid(True)
#指定图例在轴的位置 图例所有figure位置 轴与图例边框之间的距离
plt.legend(bbox_to_anchor=(1.0, 1), loc=1, borderaxespad=0.) 
plt.show()

运行效果: 

五、迷思

按计算方式一中公式计算所得eer显然有误,改变计算方式一中far、frr计算方式(效果二)所得结果看起来正常,为何如此还在思索中。。。。。。。。。。。。。。


————————————————
参考文章(感谢以下文章作者之分享):

https://blog.csdn.net/huashui2009120/article/details/78483051

https://cloud.tencent.com/developer/article/1451457

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
EER是Equal Error Rate(相等错误率)的缩写,是指在二分类问题中,当误识和漏识相等时所对应的错误率。 在MATLAB中,可以通过以下步骤计算生物识别系统的EER: 1.首先,获取测试数据的得分和标签。得分是一个向量,其中元素表示每个测试样本的得分;标签是一个向量,其中元素表示每个测试样本的标签,1表示正样本,0表示负样本。 2.使用`sort`函数将得分向量按从小到大的顺序排序,并将排序后的标签向量相应地排序。 3.计算误识和漏识。误识是指将负样本误判为正样本的比,漏识是指将正样本误判为负样本的比。可以通过以下公式计算: ```matlab FPR = cumsum(sorted_labels == 0) / sum(sorted_labels == 0); TPR = cumsum(sorted_labels == 1) / sum(sorted_labels == 1); ``` 其中,`cumsum`函数返回一个向量,其中元素是输入向量的累积和。`sorted_labels == 0`返回一个逻辑向量,其中元素为1表示对应的元素等于0,为0表示对应的元素不等于0。同理,`sorted_labels == 1`返回一个逻辑向量,其中元素为1表示对应的元素等于1,为0表示对应的元素不等于1。 4.计算EEREER是误识和漏识相等时的错误率,可以通过以下公式计算: ```matlab diff = TPR - FPR; [min_diff, min_index] = min(abs(diff)); EER = (FPR(min_index) + TPR(min_index)) / 2; ``` 其中,`diff`是TPR和FPR之差的向量,`min_diff`是`diff`中的最小值,`min_index`是`diff`中最小值的索引,即TPR和FPR之差最小的点的索引。EER是误识和漏识相等时的错误率,等于TPR和FPR之差最小的点的FPR和TPR的平均值。 以上是计算生物识别系统的EER的步骤。计算错误接受错误拒绝的方法也类似,只需要将标签向量中的1和0互换即可。具体代码实现可以参考以下示例: ```matlab % 获取测试数据的得分和标签 scores = randn(1000, 1); labels = randi([0 1], 1000, 1); % 将得分向量按从小到大的顺序排序,并将排序后的标签向量相应地排序 [sorted_scores, sort_index] = sort(scores); sorted_labels = labels(sort_index); % 计算误识和漏识 FPR = cumsum(sorted_labels == 0) / sum(sorted_labels == 0); TPR = cumsum(sorted_labels == 1) / sum(sorted_labels == 1); % 计算EER diff = TPR - FPR; [min_diff, min_index] = min(abs(diff)); EER = (FPR(min_index) + TPR(min_index)) / 2; % 计算错误接受错误拒绝 FAR = 1 - FPR; % 错误接受等于1减误识 FRR = 1 - TPR; % 错误拒绝等于1减漏识 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值