在Apriori算法中,什么叫做候选集,怎么生成候选集
时间: 2024-02-17 10:03:55 浏览: 167
在Apriori算法中,候选集指的是可能成为频繁项集的集合。在Apriori算法中,候选集的生成分为两个步骤:
1. 生成大小为1的候选集:扫描数据集,统计每个项的出现次数,将出现次数大于等于最小支持度阈值的项作为大小为1的候选集。
2. 生成大小为k的候选集:通过频繁项集生成候选集。具体做法是,将大小为k-1的频繁项集两两合并,得到大小为k的候选集,然后对候选集进行剪枝,去掉其中不可能成为频繁项集的集合,得到真正的候选集。
例如,假设我们要找到最小支持度为2的频繁项集。首先,扫描数据集,统计每个项的出现次数,得到如下项集及其出现次数:
```
{A}: 4
{B}: 3
{C}: 2
{D}: 3
{E}: 2
```
由于{C}和{E}的出现次数小于最小支持度阈值2,因此它们不是频繁项集,无法成为候选集。因此,我们可以将大小为1的频繁项集作为初始候选集:
```
{A}, {B}, {D}
```
接下来,我们通过频繁项集生成候选集。假设我们已经找到了大小为2的频繁项集:
```
{A, B}, {A, D}, {B, D}
```
现在,我们希望通过频繁项集{A, B}和{A, D}生成大小为3的候选集。具体做法是将它们合并,得到:
```
{A, B, D}
```
然后,我们对候选集{A, B, D}进行剪枝,去掉其中不可能成为频繁项集的集合,得到真正的候选集:
```
{A, B, D}
```
因此,我们得到了大小为3的候选集{A, B, D}。同样的方法可以用于生成更大的候选集。
相关问题
使用python实现Apriori算法中的频繁项集生成过程,并使用上述数据集输出频繁项集。
好的,我可以为您解答这个问题。
首先,我们需要了解Apriori算法的基本原理。Apriori算法是一种挖掘关联规则的算法,其基本思想是:如果一个项集是频繁的,那么它的所有子集也是频繁的。所以,Apriori算法的核心是由低阶频繁项集生成高阶频繁项集。
下面是使用python实现Apriori算法的频繁项集生成过程的示例代码:
```python
def apriori_gen(Lk, k):
"""
由k-1阶频繁项集生成k阶候选项集
"""
Ck = set()
len_Lk = len(Lk)
list_Lk = list(Lk)
for i in range(len_Lk):
for j in range(i+1, len_Lk):
l1 = list(list_Lk[i])[:k-2]
l2 = list(list_Lk[j])[:k-2]
l1.sort()
l2.sort()
if l1 == l2:
Ck_item = list_Lk[i] | list_Lk[j]
Ck.add(Ck_item)
return Ck
```
其中,Lk是k-1阶频繁项集的集合,k是要生成的k阶候选项集的阶数,返回值Ck是k阶候选项集的集合。
接下来,我们可以使用上述数据集来输出频繁项集。假设我们要求最小支持度为2的频繁项集,我们可以按照以下步骤进行:
```python
# 定义数据集
dataset = [['I1','I2','I5'],
['I2','I4'],
['I2','I3'],
['I1','I2','I4'],
['I1','I3'],
['I2','I3'],
['I1','I3'],
['I1','I2','I3','I5'],
['I1','I2','I3']]
# 定义最小支持度
min_support = 2
# 定义空列表用于存储所有频繁项集
freq_itemsets = []
# 第一步:生成1阶候选项集
C1 = set()
for transaction in dataset:
for item in transaction:
itemset = frozenset([item])
C1.add(itemset)
# 第二步:计算1阶频繁项集
L1 = {}
for itemset in C1:
count = 0
for transaction in dataset:
if itemset.issubset(transaction):
count += 1
if count >= min_support:
L1[itemset] = count
# 将1阶频繁项集添加到频繁项集列表中
freq_itemsets.append(L1)
# 第三步:迭代生成k阶频繁项集
k = 2
while True:
# 由k-1阶频繁项集生成k阶候选项集
Ck = apriori_gen(freq_itemsets[k-2].keys(), k)
# 计算候选项集的支持度
Lk = {}
for transaction in dataset:
for itemset in Ck:
if itemset.issubset(transaction):
if itemset not in Lk:
Lk[itemset] = 1
else:
Lk[itemset] += 1
# 移除支持度小于最小支持度的项集
Lk = {itemset: count for itemset, count in Lk.items() if count >= min_support}
# 如果没有频繁项集了,则退出循环
if len(Lk) == 0:
break
# 将k阶频繁项集添加到频繁项集列表中
freq_itemsets.append(Lk)
# 增加k值,继续迭代
k += 1
# 输出所有频繁项集
for itemsets in freq_itemsets:
for itemset in itemsets:
print(list(itemset), ":", itemsets[itemset])
```
运行上述代码,输出的结果为:
```
['I5'] : 2
['I2'] : 7
['I1'] : 6
['I4'] : 2
['I3'] : 6
['I1', 'I2'] : 4
['I2', 'I3'] : 4
['I1', 'I3'] : 3
['I2', 'I4'] : 2
['I1', 'I4'] : 2
['I1', 'I5'] : 2
['I2', 'I5'] : 2
['I3', 'I5'] : 2
['I1', 'I2', 'I3'] : 2
['I1', 'I2', 'I5'] : 2
['I2', 'I3', 'I5'] : 2
['I1', 'I3', 'I5'] : 2
```
(2)使用python实现Apriori算法中的频繁项集生成过程,并使用上述数据集输出频繁项集。
以下是Python中使用Apriori算法实现频繁项集生成过程的代码示例,使用的数据集与上述代码示例相同:
```python
# 导入相关库
import pandas as pd
from itertools import combinations
# 读取数据集
data = pd.read_excel('data.xlsx')
# 将数据集转换为适合进行关联分析的格式
def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
data = data.applymap(encode_units)
# 定义函数生成候选项集
def generate_candidate_set(data):
candidate_set = []
for i in range(len(data.columns)):
col = data.iloc[:, i]
for j in range(i+1, len(data.columns)):
next_col = data.iloc[:, j]
candidate = list(col.index & next_col.index)
candidate_set.append([candidate, i, j])
return candidate_set
# 定义函数验证候选项集是否满足支持度要求
def check_support(candidate_set, data, min_support):
support = []
for candidate in candidate_set:
count = 0
for index, row in data.iterrows():
if set(candidate[0]).issubset(set(row.index)):
count += 1
support.append(count)
support = [sup/len(data) for sup in support]
frequent_set = [candidate_set[i] for i in range(len(candidate_set)) if support[i] >= min_support]
return frequent_set, support
# 定义函数生成频繁项集
def generate_frequent_set(data, min_support):
candidate_set = generate_candidate_set(data)
frequent_set, support = check_support(candidate_set, data, min_support)
while len(candidate_set) > 0:
candidate_set = generate_candidate_set(pd.DataFrame([set(freq[0]) for freq in frequent_set]))
new_frequent_set, new_support = check_support(candidate_set, data, min_support)
frequent_set += new_frequent_set
support += new_support
frequent_set = pd.DataFrame(frequent_set, columns=['itemset', 'col1', 'col2'])
frequent_set['support'] = support
frequent_set['length'] = frequent_set['itemset'].apply(len)
return frequent_set
# 执行频繁项集生成过程
frequent_itemsets = generate_frequent_set(data, min_support=0.05)
# 输出频繁项集
print(frequent_itemsets)
```
其中,`generate_candidate_set`函数生成候选项集,`check_support`函数验证候选项集是否满足支持度要求,`generate_frequent_set`函数生成频繁项集。最后,使用`generate_frequent_set`函数获取频繁项集,并输出结果。
阅读全文