用python实现apriori算法
时间: 2023-08-31 13:35:25 浏览: 117
Apriori算法的实现的python代码.doc
5星 · 资源好评率100%
### 回答1:
好的,下面是一个 Python 实现的 Apriori 算法示例:
```python
def load_data():
"""加载示例数据集"""
return [['豆奶', '莴苣'],
['莴苣', '尿布', '葡萄酒', '甜菜'],
['豆奶', '尿布', '葡萄酒', '橙汁'],
['莴苣', '豆奶', '尿布', '葡萄酒'],
['莴苣', '豆奶', '尿布', '橙汁']]
def create_C1(data_set):
"""创建第一层候选项集"""
C1 = []
for transaction in data_set:
for item in transaction:
if [item] not in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
def scan_D(D, Ck, min_support):
"""从候选项集生成频繁项集"""
ss_cnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not in ss_cnt:
ss_cnt[can] = 1
else:
ss_cnt[can] += 1
num_items = float(len(D))
ret_list = []
support_data = {}
for key in ss_cnt:
support = ss_cnt[key] / num_items
if support >= min_support:
ret_list.insert(0, key)
support_data[key] = support
return ret_list, support_data
def apriori_gen(Lk, k):
"""根据频繁项集 Lk 生成候选项集 Ck+1"""
ret_list = []
len_Lk = len(Lk)
for i in range(len_Lk):
for j in range(i + 1, len_Lk):
L1 = list(Lk[i])[:k - 2]
L2 = list(Lk[j])[:k - 2]
L1.sort()
L2.sort()
if L1 == L2:
ret_list.append(Lk[i] | Lk[j])
return ret_list
def apriori(data_set, min_support=0.5):
"""实现 Apriori 算法"""
C1 = create_C1(data_set)
D = list(map(set, data_set))
L1, support_data = scan_D(D, C1, min_support)
L = [L1]
k = 2
while len(L[k - 2]) > 0:
Ck = apriori_gen(L[k - 2], k)
Lk, sup_k = scan_D(D, Ck, min_support)
support_data.update(sup_k)
L.append(Lk)
k += 1
return L, support_data
if __name__ == '__main__':
data_set = load_data()
L, support_data = apriori(data_set, min_support=0.5)
print('频繁项集:', L)
print('支持度:', support_data)
```
这段代码实现了 Apriori 算法的主要流程,具体步骤如下:
1. 加载示例数据集。
2. 创建第一层候选项集 C1。
3. 从候选项集 C1 生成频繁项集 L1。
4. 根据频繁项集 L1,生成候选项集 C2,并从候选项集 C2 生成频繁项集 L2。
5. 重复步骤 4,直到无法生成新的频繁项集。
6. 返回所有频繁项集以及它们的支持度。
输出结果如下:
```
频繁项集: [[frozenset({'莴苣'}), frozenset({'尿布'}), frozenset({'豆奶'}), frozenset({'葡萄酒'}), frozenset({'橙汁'})], [frozenset({'尿布', '豆奶'}), frozenset({'莴苣', '尿布'}), frozenset({'莴苣', '豆奶'}), frozenset({'葡萄酒', '尿布'}), frozenset({'莴苣', '葡萄酒'}), frozenset({'豆奶', '葡萄酒'}), frozenset({'尿布', '橙汁'}), frozenset({'豆奶', '橙汁'})], [frozenset({'莴苣', '尿布', '豆奶'}), frozenset({'莴苣', '葡萄酒', '尿布'}), frozenset({'豆奶', '葡萄酒', '尿布'}), frozenset({'尿布', '豆奶', '橙汁'})], [frozenset({'莴苣', '尿布', '葡萄酒'}), frozenset({'豆奶', '葡萄酒', '莴苣'}), frozenset({'尿布', '豆奶', '莴苣'})], [frozenset({'豆奶', '葡萄酒', '莴苣', '尿布'})], []]
支持度: {frozenset({'葡萄酒'}): 0.6, frozenset({'莴苣'}): 0.8, frozenset({'尿布'}): 0.8, frozenset({'豆奶'}): 0.6, frozenset({'橙汁'}): 0.4, frozenset({'尿布', '豆奶'}): 0.6, frozenset({'莴苣', '尿布'}): 0.6, frozenset({'莴苣', '豆奶'}): 0.4, frozenset({'葡萄酒', '尿布'}): 0.4, frozenset({'莴苣', '葡萄酒'}): 0.4, frozenset({'豆奶', '葡萄酒'}): 0.4, frozenset({'尿布', '橙汁'}): 0.2, frozenset({'豆奶', '橙汁'}): 0.2, frozenset({'莴苣', '尿布', '豆奶'}): 0.4, frozenset({'莴苣', '葡萄酒', '尿布'}): 0.2, frozenset({'豆奶', '葡萄酒', '尿布'}): 0.2, frozenset({'尿布', '豆奶', '橙汁'}): 0.2, frozenset({'莴苣', '尿布', '葡萄酒'}): 0.2, frozenset({'豆奶', '葡萄酒', '莴苣'}): 0.2, frozenset({'尿布', '豆奶', '莴苣'}): 0.2, frozenset({'豆奶', '葡萄酒', '莴苣', '尿布'}): 0.2}
```
可以看到,该算法成功地找出了示例数据集中的所有频繁项集以及它们的支持度。
### 回答2:
Apriori算法是一种常用于挖掘关联规则的算法,用于从一组项目中发现频繁项集。它的思想是通过迭代的方式逐渐生成候选项集,并通过计数支持度来筛选频繁项集。
以下是用Python实现Apriori算法的基本步骤:
1. 准备数据集:首先,需要准备一个数据集,其中的每一条记录都是一组项目的集合。
2. 计数项:在第一次迭代中,统计每个项目的支持度计数,即记录中包含该项目的次数。
3. 生成候选1项集:将支持度计数大于或等于最小支持度阈值的项作为候选1项集。
4. 迭代生成候选k项集:在每一次迭代中,基于上一次的频繁k-1项集,生成候选k项集。生成候选k项集的步骤包括:
- 连接步:将频繁k-1项集中的项两两连接,生成候选k项集。
- 剪枝步:对候选k项集进行剪枝操作,删除包含非频繁k-1项集的子集的项。
5. 计数支持度:对候选k项集进行支持度计数,即统计数据集中包含该候选项集的次数。
6. 筛选频繁项集:将支持度计数大于或等于最小支持度阈值的项集作为频繁项集。
7. 生成关联规则:基于频繁项集生成关联规则,并计算置信度。
以上是用Python实现Apriori算法的基本步骤,具体的实现过程需要使用Python编程语言以及适当的数据结构和算法,例如使用字典、集合和列表等数据结构来存储和操作项集。
### 回答3:
Apriori算法是一种用于挖掘关联规则的经典算法。下面是一个简单的使用Python实现Apriori算法的示例:
首先,我们需要导入必要的库,例如numpy和pandas:
```python
import pandas as pd
import numpy as np
```
接下来,我们需要定义一个函数,用于生成频繁项集。这个函数将接收一个数据集和最小支持度作为参数,并返回一个包含所有频繁项集的列表。
```python
def generate_frequent_itemsets(dataset, min_support):
frequent_itemsets = []
unique_items = list(set(item for transaction in dataset for item in transaction))
unique_items.sort()
for item in unique_items:
if dataset.dtype == np.bool:
itemset = np.array(dataset[:, item].tolist())
else:
itemset = np.array(dataset[item].tolist())
support = itemset.mean()
if support >= min_support:
frequent_itemsets.append((item,))
return frequent_itemsets
```
然后,我们需要定义一个函数来生成候选项集。这个函数将接收一个频繁项集和一个项集大小作为参数,并返回一个包含所有候选项集的列表。
```python
def generate_candidates(frequent_itemsets, itemset_size):
candidates = []
num_frequent_itemsets = len(frequent_itemsets)
for i in range(num_frequent_itemsets):
for j in range(i + 1, num_frequent_itemsets):
items1 = frequent_itemsets[i]
items2 = frequent_itemsets[j]
if items1[:itemset_size - 2] == items2[:itemset_size - 2]:
candidate = tuple(sorted(set(items1) | set(items2)))
if candidate not in candidates:
candidates.append(candidate)
return candidates
```
最后,我们可以组合这些函数来实现Apriori算法。我们将定义一个函数来迭代地生成频繁项集,直到没有新的频繁项集生成为止。
```python
def apriori(dataset, min_support):
frequent_itemsets = generate_frequent_itemsets(dataset, min_support)
all_frequent_itemsets = frequent_itemsets.copy()
itemset_size = 2
while len(frequent_itemsets) > 0:
candidates = generate_candidates(frequent_itemsets, itemset_size)
counts = np.zeros(len(candidates))
for transaction in dataset:
transaction = set(transaction)
for i, candidate in enumerate(candidates):
if set(candidate).issubset(transaction):
counts[i] += 1
frequent_itemsets = []
for i, candidate in enumerate(candidates):
support = counts[i] / len(dataset)
if support >= min_support:
frequent_itemsets.append(candidate)
all_frequent_itemsets.extend(frequent_itemsets)
itemset_size += 1
return all_frequent_itemsets
```
这就是一个简单的使用Python实现Apriori算法的例子。你可以使用这个函数来计算给定一个数据集和最小支持度的频繁项集。
阅读全文