在讨论这个算法之前需要知道什么是频繁项集以及关联规则,频繁项集是经常出现在一块的集合,关联规则是暗示两种物品之间有很强的关系。今天这个算法就是解决这个问题的,首先我们讨论频繁项集,支持度是频繁项集频繁的一个重要指标,支持度越高说明频繁程度越高。举个例子:比如有五组商品,其中出现某一种商品的次数是二,那么它的支持度就是2/5,如果某两种商品组合出现在一起的次数是1,那么它的支持度就是1/5,这就是支持度的定义,接下来就可以讨论频繁项集了:
from numpy import *
def loadDataSet():
return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset, C1)
def scanD(D, Ck, minSupport):
ssCnt = {}
for tid in D:
for can in Ck:
if can.issubset(tid):
if not ssCnt.has_key(can): ssCnt[can]=1
else: ssCnt[can] += 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上面的第二个函数建立的是第一个候选集列表,该列表中记录的是单个项集,为什么单独一个函数创建但个项集,一会就看到。接下来第三个函数计算支持度,输入参数为数据集候选项集和最小支持度,首先创建一个字典,键是候选项集,值是该候选项在数据集中出现的次数,for循环遍历整个数据集和候选项集记录候选项集出现的次数。最后计算支持度,如果满足就将其添加到列表中。
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):
C1 = createC1(dataSet)
D = 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上面第一个函数输入参数为频繁项集列表和项集元素个数,这个函数用来生成组合的频繁项集,这里有一个k-2,当用包含多项的项集进行组合时,同样的组合会出现三次,所以取其中的一次即可,这里也就是为什么一个项集的组合要单独一个函数实现。下面一个函数是整体调用函数,最后输出满足最小支持度的项。

本文介绍了Apriori算法的基本原理及其实现过程,包括频繁项集和支持度的概念,并通过具体实例解释了如何利用该算法发现数据间的关联关系。
1万+

被折叠的 条评论
为什么被折叠?



