错误接受率 (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 sysdata = 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 = 0t_nt = 0nt_t = 0nt_nt = 0lt_pt = lf_pt = lt_pf = lt_pt = 0for 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 +=1else:if pre > t:nt_t +=1else:nt_nt +=1print(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_splineclass_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
總結
以上是生活随笔為你收集整理的错误接受率 (FAR), 错误拒绝率(FRR), 等错误率(EER)代码简易实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络实验以太网帧分析,计算机网络原
- 下一篇: Demo2:Retrofit+Rxjav