在Apriori算法中,什么叫做候选集,怎么生成候选集
时间: 2024-02-17 18:03:54 浏览: 67
在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}。同样的方法可以用于生成更大的候选集。
相关问题
在一个事务表中运用Apriori算法找出频繁项集
Apriori算法是一种挖掘频繁项集的经典算法,可以用于在事务表中发现频繁项集。下面是使用Apriori算法在事务表中找出频繁项集的步骤:
1. 将事务表中的所有项放在一个集合中,称之为C1。
2. 扫描整个事务表,统计每个项集的出现次数,并将出现次数大于等于最小支持度阈值的项集放在一个集合中,称之为L1。
3. 根据L1,生成候选项集C2。C2中的每个项集都是由两个L1中频繁项集组合而成的,可以使用连接操作来生成。
4. 扫描整个事务表,统计每个候选项集的出现次数,并将出现次数大于等于最小支持度阈值的候选项集放在一个集合中,称之为L2。
5. 根据L2,生成候选项集C3。C3中的每个项集都是由三个L2中频繁项集组合而成的,可以使用连接操作来生成。
6. 重复步骤4和步骤5,直到无法生成新的候选项集为止。
7. 将所有的频繁项集放在一个集合中,称之为F。
以上就是使用Apriori算法在事务表中找出频繁项集的步骤。需要注意的是,Apriori算法的核心是利用频繁项集的性质,通过不断连接和剪枝来减少候选项集的数量,从而提高挖掘效率。
使用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
```