如何在python中为apriori算法生成k项集

如何在python中为apriori算法生成k项集,python,tuples,apriori,Python,Tuples,Apriori,这是我第一次尝试用python编写代码,我正在实现Apriori算法。我已经生成了2-itemset,下面是我必须通过组合1-itemset的键来生成2-itemset的函数 我如何使这个函数通用?我的意思是,通过传递字典的键和元组中所需的元素数,算法应该使用键生成所有可能的n个(k+1)子集。我知道集合上的并集是可能的,但是有没有一种方法可以实现元组的并集,元组本质上是字典的键 # generate 2-itemset candidates by joining the 1-itemset c

这是我第一次尝试用python编写代码,我正在实现Apriori算法。我已经生成了2-itemset,下面是我必须通过组合1-itemset的键来生成2-itemset的函数

我如何使这个函数通用?我的意思是,通过传递字典的键和元组中所需的元素数,算法应该使用键生成所有可能的n个(k+1)子集。我知道集合上的并集是可能的,但是有没有一种方法可以实现元组的并集,元组本质上是字典的键

# generate 2-itemset candidates by joining the 1-itemset candidates
def candidate_gen(keys):
    adict={}
    for i in keys:
        for j in keys:
            #if i != j and (j,i) not in adict:
            if j>i:
        #call join procedure which will generate f(k+1) keys
        #call has_infrequent_subset --> generates all possible k+1 itemsets and checks if k itemsets are present in f(k) keys
                adict[tuple([min(i,j),max(i,j)])] = 0
    return adict
例如,如果我的初始字典看起来像:{key,value}-->value是频率

{'382': 1163, '298': 560, '248': 1087, '458': 720, 
 '118': 509,  '723': 528, '390': 1288}
我获取这个字典的键并将其传递给上面提到的候选函数 它将生成2项集的子集,并给出键的输出。然后,我会将键传递给函数,通过与原始数据库进行比较来查找频率,以获得以下输出:

{('390', '723'): 65, ('118', '298'): 20, ('298', '390'): 70, ('298', '458'): 35, 
 ('248', '382'): 88, ('248', '458'): 76, ('248', '723'): 26, ('382', '723'): 203,
 ('390', '458'): 33, ('118', '458'): 26, ('458', '723'): 26, ('248', '390'): 87,
 ('118', '248'): 54, ('298', '382'): 47, ('118', '723'): 41, ('382', '390'): 413,
 ('382', '458'): 57, ('248', '298'): 64, ('118', '382'): 40, ('298', '723'): 36, 
 ('118', '390'): 52}
如何从上述键生成3项集子集。

In [12]: [(x, y) for x in keys for y in keys if y>x]
Out[12]: 
[('382', '723'),
 ('382', '458'),
 ('382', '390'),
 ('458', '723'),
 ('298', '382'),
 ('298', '723'),
 ('298', '458'),
 ('298', '390'),
 ('390', '723'),
 ('390', '458'),
 ('248', '382'),
 ('248', '723'),
 ('248', '458'),
 ('248', '298'),
 ('248', '390'),
 ('118', '382'),
 ('118', '723'),
 ('118', '458'),
 ('118', '298'),
 ('118', '390'),
 ('118', '248')]

我假设,考虑到您所在的领域,您可以从python库的研究中获益匪浅

在您的用例中,您可以直接使用itertools
组合
或者将其包装在助手函数中

from itertools import combinations
def ord_comb(l,n):
    return list(combinations(l,n))

#### TESTING ####
a = [1,2,3,4,5]
print(ord_comb(a,1))
print(ord_comb(a,5))
print(ord_comb(a,6))
print(ord_comb([],2))
print(ord_comb(a,3))
输出

[(1,), (2,), (3,), (4,), (5,)]
[(1, 2, 3, 4, 5)]
[]
[]
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]

请注意,
n
-uples中元素的顺序取决于您在传递给
组合的iterable中使用的顺序。能否给出一些示例输入和预期输出?这将使您的问题对每个人都更加清楚。如果j>i:adict[tuple([min(i,j),max(i,j)])]=0,您的代码就有
,但它相当于代码中更简单的
如果j>i:adict[i,j]=0,那么
键就是字符串,如果字符串长度相同,比较
j
就有效。请在解释器提示下尝试
print('oh!',如果'99'>'100',否则'ok')
。谢谢您的回复。这将在包含a=[1,2,3,4,5]-->单个元素的列表上给出n个数字组合。假设我的输入是a=[(1,2),(3,4),(1,5)],依此类推。如何在上面生成n个数的组合?比如,输出-->a=[(1,2,3),(1,2,4)…,(1,2,5)]等等。@prakyathj,我的
测试
代码中的最后一个例子,这不是你要找的吗?在您的示例中,2级元组的数量为21,即((7x8)/2-7)原始7项的所有非重复组合2乘2,因此我推断(没有apriori算法方面的专业知识)您需要原始7项中3项的所有不同有序组合。。。如果对于第3级,您需要与这些组合不同的内容,请告诉我,因为我无法理解。@prakyathj我想强调的是,在我的回答中,框中最后一行标记为“输出”的内容正是您在上一条评论末尾所写的未满足要求。OP需要第3级组合,正如在
[(x,y,z)中,如果x(4,…,n)
imho,最好是像
itertools.compositions这样的函数如果他需要更深层次和灵活性,那么是的。他粘贴的代码生成2个项目集