Apriori의 가지치기 단계가 없다. join만 하고 downward closure 검사를 건너뛴다
#Apriori 알고리즘의 핵심은 두 단계다. (1) 빈발 (k-1)-항목집합을 조인해 k-후보를 만들고, (2) 그 후보의 모든 (k-1)-부분집합이 빈발한지 확인해 아닌 것을 버린다. 이 코드에는 (1)만 있다. 두 개의 빈발 (k-1)-집합의 합집합이 크기 k이기만 하면 무조건 후보가 된다.
공짜로 얻는 성질이 아니다. 실제 input.txt에 최소 지지도 5%를 적용해 계측한 결과, 전체 후보 1,905개 중 552개(29%)가 가지치기로 제거 가능했다. k=4에서는 생성된 455개 중 23개만 모든 3-부분집합이 빈발했다 — 즉 95%가 낭비된 스캔이다. k=5에서는 120개 후보 전부가 무효였다. 입력이 작아 체감되지 않을 뿐, 이건 "Apriori를 구현했다"와 "brute-force에 조인 최적화를 얹었다"의 차이다.
while candidates:
filtered = scan()
result[k - 1] = filtered
candidates = {i.union(j) for i in filtered for j in filtered if len(i.union(j)) == k}
k += 1 # ← 조인만. 부분집합이 전부 빈발한지 검사하는 prune 단계가 없음