это первый раз, когда я пытаюсь кодировать на питоне, и я реализую алгоритм априори. Я сгенерировал до 2-элементных наборов, и ниже приведена функция, которую я должен создать из 2-элементных наборов, комбинируя ключи 1-элементного набора.
Как мне сделать эту функцию универсальной? Я имею в виду, что, передавая ключи словаря и количество элементов, необходимых в кортеже, алгоритм должен генерировать все возможные 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
Например, если мой исходный словарь выглядит так: {ключ, значение} --> значение - это частота
{'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-х элементов из приведенных выше ключей.
if j>i: adict[tuple([min(i,j),max(i,j)])] = 0
, но он эквивалентен более простомуif j>i: adict[i,j]=0
. - person gboffi   schedule 23.10.2014keys
являются строками, и сравнениеj>i
работает, если строки имеют одинаковую длину. Пожалуйста, попробуйтеprint('oh!' if '99'>'100' else 'ok.')
в приглашении интерпретатора... - person gboffi   schedule 23.10.2014