这是我第一次尝试在 python 中编写代码,并且正在实现 Apriori 算法。我已经生成了 2 项集,下面是我必须通过组合 1 项集的键来生成 2 项集的功能。
如何使此功能通用?我的意思是,通过传递字典的键和元组中所需的元素数量,算法应该使用这些键生成所有可能的 n-number(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}
我把这个字典的键传递给上面提到的candidate_gen 函数,它将生成2-itemsets 的子集并给出键的输出。然后,我将通过与原始数据库进行比较来将密钥传递给函数以查找频率,从而获得以下输出:
{('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 项集子集。