我可能不清楚解释。 我想要一个比较函数来确定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)唯一值与B(5)相同; 列表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]。 我仍然认为它们是相同的。
如何检查比较功能的准确性? 谢谢!
答案 0 :(得分:2)
如果要比较集合交集的长度与集合的长度:
&
)|
)此方法不考虑位置或分布:
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
答案 1 :(得分:0)
这是一种不同的方法,可能更接近你想要的方法。它并不完美,你可能需要优化它。
说实话,我不明白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
答案 2 :(得分: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_num
test_num
是数据框final_result
的2列,您可以将其替换为数据。
要小心,使用analysis = analysis / 50
, 50 是数据中每个元素的总度,您应该更改它。