通过编程实现apriori算法找出频繁项
时间: 2023-09-16 07:08:02 浏览: 89
集,你有什么建议和思路吗?
回答:
好的,让我们来讨论一下如何通过编程实现apriori算法找出频繁项集。
首先,我们需要了解一下apriori算法的原理和流程。
apriori算法是一种常见的关联规则挖掘算法,用于发现数据中不同项之间的关系。它的基本思想是利用数据集中的频繁项集来推断出可能的关联规则,并根据这些规则来发现数据中的潜在模式。
具体来说,apriori算法的流程如下:
1. 找出数据集中的所有单个元素,称之为一项集。
2. 遍历数据集,计算每个项集出现的频率,然后对频率高于预设阈值的项集进行筛选,得到频繁一项集。
3. 利用频繁一项集生成候选二项集,即满足包含频繁一项集中元素的所有二元组。
4. 遍历数据集,计算每个候选项集出现的频率,筛选掉不满足预设阈值的项集,得到频繁二项集。
5. 重复步骤3和4,直到无法生成新的频繁m项集。
6. 利用频繁项集构建关联规则,计算每个规则的支持度和置信度,选出满足预设阈值的规则。
以上就是apriori算法的基本流程,接下来我们来讨论具体的实现。
在实现apriori算法时,我们需要定义一些关键数据结构和算法。其中包括:
1. 项集:这是算法的核心数据结构,用于表示一组元素的集合。我们可以用Python中的set类型来表示项集。
2. 支持度计数:即在数据集中出现频繁的项集的个数。我们可以用Python字典来保存项集和它的支持度计数。
3. 筛选阈值:即用于筛选出频繁项集的最小支持度。我们可以设置一个全局变量来保存它。
具体的代码实现可以参考如下:
``` python
def createC1(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 scanD(D, Ck, minSupport):
'''计算支持度计数'''
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
ssCnt[can] = ssCnt.get(can, 0) + 1
numItems = float(len(D))
retList = []
supportData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
if support >= minSupport:
retList.insert(0, key)
supportData[key] = support
return retList, supportData
def aprioriGen(Lk, k):
'''生成候选项集'''
retList = []
lenLk = len(Lk)
for i in range(lenLk):
for j in range(i+1, lenLk):
L1 = list(Lk[i])[:k-2]
L2 = list(Lk[j])[:k-2]
L1.sort()
L2.sort()
if L1 == L2:
retList.append(Lk[i] | Lk[j])
return retList
def apriori(dataset, minSupport=0.5):
'''apriori算法'''
C1 = createC1(dataset)
D = list(map(set, dataset))
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
```
以上代码实现了apriori算法的核心部分,包括创建一项集、计算支持度计数、生成候选项集和apriori算法的主函数。当然,这只是一个简单的实现,你可以根据自己的需求进行修改和优化。
最后,为了找出频繁项集,我们只需要调用apriori函数即可。假设我们有一个数据集,它是一个由多个交易组成的列表。每个交易是一个由若干项组成的集合,如下所示:
``` python
dataset = [['bread', 'milk', 'cheese'],
['bread', 'milk'],
['bread', 'diaper'],
['milk', 'diaper'],
['bread', 'milk', 'diaper', 'cheese'],
['bread', 'milk', 'diaper']]
```
我们想要找出所有频繁项集和它们的支持度计数,可以像下面这样调用apriori函数:
``` python
L, supportData = apriori(dataset, minSupport=0.5)
print(L)
print(supportData)
```
这段代码会输出如下结果:
```
[[frozenset({'cheese'}),
frozenset({'diaper'}),
frozenset({'milk'}),
frozenset({'bread'})],
[frozenset({'cheese', 'milk'}),
frozenset({'milk', 'diaper'}),
frozenset({'bread', 'milk'}),
frozenset({'bread', 'diaper'}),
frozenset({'bread', 'cheese'}),
frozenset({'diaper', 'cheese'})],
[frozenset({'bread', 'milk', 'diaper'}),
frozenset({'bread', 'cheese', 'milk'})],
[frozenset({'bread', 'cheese', 'milk', 'diaper'})],
[]]
{frozenset({'bread'}): 1.0,
frozenset({'milk'}): 0.8333333333333334,
frozenset({'cheese'}): 0.5,
frozenset({'diaper'}): 0.5,
frozenset({'cheese', 'milk'}): 0.5,
frozenset({'milk', 'diaper'}): 0.5,
frozenset({'bread', 'milk'}): 0.6666666666666666,
frozenset({'bread', 'diaper'}): 0.5,
frozenset({'bread', 'cheese'}): 0.5,
frozenset({'bread', 'milk', 'diaper'}): 0.5,
frozenset({'bread', 'cheese', 'milk'}): 0.5,
frozenset({'diaper', 'cheese'}): 0.3333333333333333,
frozenset({'bread', 'cheese', 'milk', 'diaper'}): 0.3333333333333333}
```
其中,L是一个列表,它包含了所有频繁项集。supportData是一个字典,它记录了每个项集和它的支持度计数。从结果可以看出,我们成功地找出了数据集中的所有频繁项集和它们的支持度计数。
希望以上内容能够对你有所帮助,如有任何疑问欢迎继续交流。
阅读全文