微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有效地计算频繁配对的出现

如何解决有效地计算频繁配对的出现

我有一个大的购物篮数据库(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 举报,一经查实,本站将立刻删除。