如何在 python 中比较 2 个列表的准确性?



我可能解释不清楚。 我想有一个比较函数来识别 2 个列表中的相同索引的值是否相同。

例如,2 列出 A 和 B,它们应该相同(准确度 = 100%)。

A=[1,2,1,1,3,4,3,2,5]       
B=[4,2,4,4,3,1,3,2,5]

因为 A(0)、A(2)、A(3) 是相同的值 = 1,而 B(0)、B(2)、B(3) 是相同的值 = 4;A(1),A(7) 的值相同 = 2,与 B(1),B(7) 相同; A(4),A(6) 的值相同 = 3,与 B(4)、B(6) 相同; A(5),列表 A 中的唯一值,与 B(5) 相同; 列表 A 中的唯一值 A(8) 与 B(8) 相同。

然后对列表C和D采取相同的规则,其准确率应该是80%。

C=[1,2,2,2,3,4,4,4,5,6]
D=[3,4,4,4,1,5,5,6,5,6] 

D(7) 的值应与 D(5) 相同,D(6) 与 D(9) 不同,D(8) 不应与 D(5) 相同,D(6) 的值应为独立值。

注意:列表中的值可能不是序列号。 列表 A 可以 也可以是 [1,26,1,1,30,4,30,26,5],B 可以是 [4,22,4,4,3,100,3,22,5]。 我仍然认为它们是一样的。

如何让比较函数的准确性来检查它? 谢谢!

如果要将集合交集的长度与集合并集的长度进行比较:

  • 两个列表中有多少个元素?(设置交叉点&)
  • 总共有多少个元素?(设置联合|)

此方法不考虑仓位或分布:

A = [1, 2, 1, 1, 3, 4, 3, 2, 5]
B = [4, 2, 4, 4, 3, 1, 3, 2, 5]
C = [1, 2, 2, 2, 3, 4, 4, 4, 5, 6]
D = [3, 4, 4, 4, 1, 5, 5, 6, 5, 6]
def overlapping_percentage(x, y):
return (100.0 * len(set(x) & set(y))) / len(set(x) | set(y))
print(overlapping_percentage(A, B))
# 100.0
print(overlapping_percentage(C, D))
# 83.3

这是一种不同的方法,可能更接近您想要的方法。它并不完美,您可能需要对其进行优化。

老实说,我不明白这80%到底是从哪里来的。

此方法从列表中提取"指纹":元素的放置位置,独立于其值。然后将指纹相互比较:

from collections import defaultdict
A=[1,2,1,1,3,4,3,2,5]
B=[4,2,4,4,3,1,3,2,5]
C = [1, 2, 2, 2, 3, 4, 4, 4, 5, 6]
D = [3, 4, 4, 4, 1, 5, 5, 6, 5, 6]
def fingerprint(lst):
r = defaultdict(list)
for i,x in enumerate(lst):
r[x].append(i)
return sorted(r.values())
fA = fingerprint(A)
# [[0, 2, 3], [1, 7], [4, 6], [5], [8]]
fB = fingerprint(B)
# [[0, 2, 3], [1, 7], [4, 6], [5], [8]]
fC = fingerprint(C)
# [[0], [1, 2, 3], [4], [5, 6, 7], [8], [9]]
fD = fingerprint(D)
# [[0], [1, 2, 3], [4], [5, 6, 8], [7, 9]]
print((100.0*sum(1 for a,b in zip(fA, fB) if a == b)/len(fB)))
# 100.0
print((100.0*sum(1 for c,d in zip(fC, fD) if c == d)/len(fD)))
# 60.0

现在回答为时已晚,但我以另一种方式做了同样的事情,您可以计算每个数字百分比与同一索引中的另一个列表相同。

我就给你我的代码,你可以参考一下。

def accuracy(self,*args):
check = final_result['train_num'] == final_result['test_num']
passed = final_result[check]
accuracy = len(passed.index) / len(final_result.index)
analysis = passed['test_num'].value_counts()
analysis = analysis / 50  
analysis['accuracy']=round(accuracy,5)
pd.Series.to_csv(analysis,csvpath+"accuracy.csv",sep=',')
print("accuracy:{:.3f}".format(accuracy))

train_numtest_num是数据帧final_result的2列,则可以将其替换为您的数据。

请注意analysis = analysis / 50,50是我数据中每个元素的总度数,您应该更改它。

最新更新