Apriori算法实现
时间: 2023-09-15 10:17:57 浏览: 52
Apriori算法是常用的数据挖掘算法之一,用于挖掘频繁项集和关联规则。下面是一个简单的Apriori算法实现,供参考。
假设我们有一个包含多个事务的数据集,每个事务包含多个项。我们的目标是找到所有出现频率超过某个阈值的项集。
首先,我们需要定义一些变量和函数:
- transactions:数据集,每个元素是一个事务,是一个列表。
- threshold:频率阈值,用于筛选频繁项集。
- items:所有项的集合,是一个列表。
- min_support:最小支持度,用于计算频繁项集。
- frequent_sets:频繁项集,是一个字典,key是项集的大小,value是所有该大小的频繁项集的列表。
```
def apriori(transactions, threshold):
items = set()
for transaction in transactions:
for item in transaction:
items.add(item)
items = list(items)
items.sort()
min_support = len(transactions) * threshold
frequent_sets = {}
# 频繁项集大小为1的情况
frequent_sets[1] = []
for item in items:
count = sum([1 for transaction in transactions if item in transaction])
if count >= min_support:
frequent_sets[1].append(frozenset([item]))
# 频繁项集大小大于1的情况
k = 2
while len(frequent_sets[k-1]) > 0:
frequent_sets[k] = []
# 生成候选项集
candidates = set()
for i in range(len(frequent_sets[k-1])):
for j in range(i+1, len(frequent_sets[k-1])):
candidate = frequent_sets[k-1][i] | frequent_sets[k-1][j]
if len(candidate) == k and candidate not in candidates:
candidates.add(candidate)
# 计算支持度
counts = {candidate: 0 for candidate in candidates}
for transaction in transactions:
for candidate in candidates:
if candidate.issubset(transaction):
counts[candidate] += 1
# 保留支持度大于等于阈值的项集
frequent_sets[k] = [candidate for candidate in candidates if counts[candidate] >= min_support]
k += 1
return frequent_sets
```
这个实现中,我们首先遍历所有事务,将所有项放入一个集合中。然后按照字典序排序,得到所有项的列表。接着,我们计算出最小支持度min_support,用于筛选频繁项集。接下来,我们初始化频繁项集字典,并计算出频繁项集大小为1的情况。然后,我们依次计算出频繁项集大小为2、3、4...直到没有更多频繁项集为止。
对于每个频繁项集大小k,我们首先生成候选项集。具体来说,我们遍历频繁项集大小为k-1的所有项集,然后取它们的并集,得到所有可能的候选项集。接着,我们遍历所有事务,计算每个候选项集的支持度。最后,我们保留支持度大于等于阈值的项集,即为频繁项集。
需要注意的是,这里我们使用了frozenset来表示项集,因为set不能作为字典的key。此外,我们还使用了一些Python的语法糖,如列表推导式、集合推导式、集合运算等。
阅读全文