一、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