实现Apriori算法
时间: 2023-12-01 11:53:26 浏览: 80
Apriori算法是一种常见的关联规则挖掘算法,用于发现数据集中的频繁项集。下面给出Apriori算法的Python实现。
假设我们有一个包含多个事务的数据集,每个事务包含多个项。我们首先需要计算出单个项的支持度,即它们出现的频率。然后我们可以使用这些支持度来生成包含多个项的频繁项集。频繁项集是指出现频率超过预定阈值的项集。
具体来说,Apriori算法的实现过程如下:
1. 从数据集中生成所有单个项的候选项集,计算每个项集的支持度;
2. 从候选项集中生成包含多个项的频繁项集,计算每个项集的支持度;
3. 如果没有更多的频繁项集可以生成,则停止算法。
下面是Apriori算法的Python实现:
```python
def load_dataset():
# 构造示例数据集
return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
def create_c1(dataset):
# 生成所有单个项的候选项集
c1 = []
for transaction in dataset:
for item in transaction:
if not [item] in c1:
c1.append([item])
c1.sort()
return list(map(frozenset, c1))
def scan_dataset(dataset, candidate_set, min_support):
# 计算候选项集的支持度
support_count = {}
for transaction in dataset:
for candidate in candidate_set:
if candidate.issubset(transaction):
support_count[candidate] = support_count.get(candidate, 0) + 1
num_items = float(len(dataset))
frequent_set = []
support_data = {}
for candidate, count in support_count.items():
support = count / num_items
if support >= min_support:
frequent_set.append(candidate)
support_data[candidate] = support
return frequent_set, support_data
def apriori(dataset, min_support=0.5):
# 生成包含多个项的频繁项集
candidate_set = create_c1(dataset)
frequent_set, support_data = scan_dataset(dataset, candidate_set, min_support)
frequent_sets = [frequent_set]
k = 2
while len(frequent_sets[k-2]) > 0:
candidate_set = generate_candidate_set(frequent_sets[k-2], k)
frequent_set, support = scan_dataset(dataset, candidate_set, min_support)
support_data.update(support)
frequent_sets.append(frequent_set)
k += 1
return frequent_sets, support_data
def generate_candidate_set(itemset, k):
# 生成包含k个项的候选项集
candidate_set = []
n_items = len(itemset)
for i in range(n_items):
for j in range(i+1, n_items):
l1 = list(itemset[i])[:k-2]
l2 = list(itemset[j])[:k-2]
l1.sort()
l2.sort()
if l1 == l2:
candidate_set.append(itemset[i] | itemset[j])
return candidate_set
if __name__ == '__main__':
dataset = load_dataset()
frequent_sets, support_data = apriori(dataset, min_support=0.5)
for i, frequent_set in enumerate(frequent_sets):
print('frequent {}-itemsets:'.format(i+1))
for itemset in frequent_set:
print(itemset, support_data[itemset])
```
这里使用了两个辅助函数`create_c1`和`generate_candidate_set`,分别用于生成单个项的候选项集和包含多个项的候选项集。`scan_dataset`函数用于计算候选项集的支持度,并返回频繁项集和其支持度。`apriori`函数则用于生成所有频繁项集。最后,我们可以打印出所有频繁项集和其支持度。
阅读全文