为了账号安全,请及时绑定邮箱和手机立即绑定

阻止值在每次字典迭代中递增

阻止值在每次字典迭代中递增

ITMISS 2021-06-21 09:08:09
我正在使用 Python 2.7。我有两个 tsv 数据文件,我读入了两个字典,我想计算recall它们的分数,所以我需要计算tp和fn。这些是我的字典的样子:gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'}results = {'A2':'cat', 'B2':'dog'}我的代码主要是迭代的gold字典,并在年底消除数字gold字典key以及results key。然后,检查键是否匹配以查找它们的值是否匹配以计算tp. 但是,我的代码似乎总是增加fn. 这是我的可运行代码:from __future__ import divisionimport stringdef eval():        tp=0 #true positives        fn=0 #false negatives        fp=0#false positives        gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'}        results = {'A2':'cat', 'B2':'dog'}       #iterate gold dictionary        for i,j in gold.items():            #remove the digits off gold keys            i_stripped = i.rstrip(string.digits)            #iterate results dictionary            for k,v in results.items():                #remove the digits off results keys                k_stripped = k.rstrip(string.digits)                # check if key match!                if i_stripped == k_stripped:                  #check if values match then increment tp                  if j == v:                      tp += 1                      #delete dictionary entries to avoid counting them again                      del gold_copy[i]                      del results_copy[k]                      #get out of this loop we found a match!                       break                continue            # NO match was found in the results, then consider it as fn             fn += 1 #<------ wrong calculations caused in this line        print 'tp = %.2f   fn =  %.2f    recall = %.2f ' % (tp, fn, float(tp)/(tp+fn)) 这是输出:tp = 1.00   fn =  3.00    recall = 0.25 fn是不正确的,应该是2而不是3。如何停止fn在每次迭代中递增?任何指导将不胜感激。谢谢,
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

在我看来,您只想fn在结果中找不到匹配项时才增加。您可以使用变量来跟踪是否已找到匹配项,并在此基础上增加fn。在下面,我调整了您的代码并用于match_found此目的。


#iterate gold dictionary

 for i,j in gold.items():


     # create a variable that indicates whether a match was found

     match_found = False


     #remove the digits off gold keys

     i_stripped = i.rstrip(string.digits)


     #iterate results dictionary

     for k,v in results.items():


         #remove the digits off results keys

         k_stripped = k.rstrip(string.digits)


         # check if key match!

         if i_stripped == k_stripped:


           #check if values match then increment tp

           if j == v:

               tp += 1


               # now a match has been found, change variable

               match_found = True


               #delete dictionary entries to avoid counting them again

               del gold_copy[i]

               del results_copy[k]


               #get out of this loop we found a match! 

               break

         continue


     # NO match was found in the results, then consider it as fn 

     # now, only if no match has been found, increment fn

     if not match_found :

         fn += 1 #<------ wrong calculations caused in this line


查看完整回答
反对 回复 2021-06-22
?
HUX布斯

TA贡献1876条经验 获得超6个赞

如果这不是您所需要的,您应该能够对其进行修改以使其正常工作。


tp = 0 #true positives

fn = 0 #false negatives

fp = 0 #false positives



gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'}

results = {'A2':'cat', 'B2':'dog'}


for gold_k, gold_v in gold.items():

    # Remove digits and make lower case

    clean_gold_k = gold_k.rstrip(string.digits).lower()


    for results_k, results_v in results.items():

        # Remove digits and make lower case

        clean_results_k = results_k.rstrip(string.digits).lower()


        keys_agree = clean_gold_k == clean_results_k

        values_agree = gold_v.lower() == results_v.lower()


        print('\n-------------------------------------')

        print('Gold = ' + gold_k + ': ' + gold_v)

        print('Result = ' + results_k + ': ' + results_v)


        if keys_agree and values_agree:

            print('tp')

            tp += 1


        elif keys_agree and not values_agree:

            print('fn')

            fn += 1


        elif values_agree and not keys_agree:

            print('fp')

            fp += 1


查看完整回答
反对 回复 2021-06-22
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号