Apriori
Apriori
class Transaction:
def __init__(self):
self.items = []
self.count = 0
class Itemset:
def __init__(self):
self.itemset = []
self.count = 0
self.support = 0
def get_user_input():
global num_transactions, num_items, transactions
num_transactions = int(input("Enter the number of transactions: "))
num_items = int(input("Enter the number of items: "))
transactions = []
for i in range(num_transactions):
transaction = Transaction()
items = input(f"Enter items for transaction {i + 1} (comma-separated, e.g.,
1,2,3): ").split(',')
transaction.items = list(map(int, items))
transaction.count = len(transaction.items)
transactions.append(transaction)
def print_transactions():
for i, transaction in enumerate(transactions):
print(f"Transaction {i + 1}: {' '.join(map(str, transaction.items))}")
def count_items():
item_counts = [0] * (num_items + 1)
for transaction in transactions:
for item in transaction.items:
item_counts[item] += 1
print("\nItem Counts:")
for i in range(1, num_items + 1):
if item_counts[i] > 0:
print(f"Item {i}: {item_counts[i]}")
def is_subset(subset, set_):
i, j = 0, 0
while i < len(subset) and j < len(set_):
if subset[i] < set_[j]:
return False
elif subset[i] == set_[j]:
i += 1
j += 1
return i == len(subset)
def generate_candidates(k):
candidates = []
for i in range(num_items):
for j in range(i + 1, num_items):
candidate = Itemset()
candidate.itemset = [i + 1, j + 1]
candidate.count = 2
candidate.support = 0
candidates.append(candidate)
return candidates
def generate_candidates_size_k(prev_candidates, k):
candidates = []
length = len(prev_candidates)
for i in range(length):
for j in range(i + 1, length):
first = prev_candidates[i].itemset[:k-2]
if first == prev_candidates[j].itemset[:k-2]:
candidate = Itemset()
candidate.itemset = first + [prev_candidates[i].itemset[k-2],
prev_candidates[j].itemset[k-2]]
candidates.append(candidate)
return candidates
def calculate_support(candidates):
for candidate in candidates:
count = 0
for transaction in transactions:
if is_subset(candidate.itemset, transaction.items):
count += 1
candidate.support = count
def prune_candidates(candidates):
return [candidate for candidate in candidates if candidate.support >= min_support]
def apriori():
candidates = generate_candidates(2)
calculate_support(candidates)
candidates = prune_candidates(candidates)
print("\nFrequent Itemsets of size 2:")
for candidate in candidates:
print(f"{' '.join(map(str, candidate.itemset))} - Support:
{candidate.support}")
k = 3
while candidates:
candidates = generate_candidates_size_k(candidates, k)
calculate_support(candidates)
candidates = prune_candidates(candidates)
if candidates:
print(f"\nFrequent Itemsets of size {k}:")
for candidate in candidates:
print(f"{' '.join(map(str, candidate.itemset))} - Support:
{candidate.support}")
transactions = []
num_transactions = 0
num_items = 0
min_support = 0
get_user_input()
print_transactions()
count_items()
min_support = int(input("Enter the minimum support (e.g., 2): "))
apriori()
Output: