如何解决有效地计算频繁配对的出现
我有一个大的购物篮数据库(N = 31101),并且我想计算频繁配对的出现次数。我正在使用get_sup
函数来执行此操作。我可以在几分钟内获得常用物品的数量。但是,要获得频繁配对的计数需要花费很长时间,因为有269745对,并且所有这些配对都必须在N个购物篮中进行检查。
我正在使用get_sup
函数中的for循环来做到这一点。在Spark中还有其他技巧可用来更有效地做到这一点。
def get_sup(x):
x_sup = 0
for t in shared_itemset.value:
if x.issubset(t):
#if set({x}).issubset(set(t)):
x_sup +=1
if x_sup >= sup:
return x,x_sup
else:
return ()
data = sc.textFile('browsing.txt')
itemset = data.map(lambda line: ([item for item in line.strip().split(' ')]))
shared_itemset = sc.broadcast(itemset.map(lambda x: frozenset(x)).collect())
c1 = data.flatMap(lambda line: line.strip().split(' ')).distinct()
c1 = c1.map(lambda x : frozenset({x}))
print(c1.count())----------------------------------------------- 12592
f1 = c1.map(get_sup).filter(lambda x: x)
print(f1.count())----------------------------------------------- 735
f1.persist()
f1m = f1.map(lambda x: tuple(x[0]))
f1c = f1m.cartesian(f1m).map(lambda x: frozenset(x[0]+x[1])).filter(lambda x: len(x)>1).distinct()
# f1c has 269745 elements and has data structure frozenset({'FRO11987','GRO73461'})
f2 = f1c.map(get_sup).filter(lambda x: x) pairs
谢谢。对于整个数据集,请使用this file
解决方法
此解决方案可能有效:对于每个购物篮,它都会计算其元素的可能对,然后检查pair
是否在这些元素中。然后输出包含该对的篮子的百分比。
from itertools import permutations
b1 = [1,2,3,4]
b2 = [4,5,6]
baskets = [b1,b2]
pair = [1,2]
def finder(baskets,pair):
baskets_asstr = [''.join(map(str,i)) for i in baskets]
pairsOfEveryBasket = [["".join(i) for i in permutations(baskets_asstr[j],2)] for j in range(len(baskets_asstr))]
zipped = list(zip(baskets_asstr,pairsOfEveryBasket))
pair_str = "".join([str(i) for i in pair])
num = 0
for i in zipped:
if pair_str in i[1]:
num += 1
return (num/len(baskets_asstr)
finder(baskets,pair)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。