1 几个概念:
(1)关联分析:一种在大规模数据中寻找有趣关系的任务。这种有趣关系一般有两种形式:频繁项集或者关联规则。
(2)频繁项集:经常,频繁出现在一起的物品集合,通常用一对{}来表示。
(3)关联规则:两种物品之间存在的关联关系,通常用“”表示。
(4)支持度:这是用来衡量频繁项集的因子。一个项集的支持度即为一个数据集中包含该项集的记录所占的比例。
(5)可信度(置信度):这是用来衡量关联规则的因子。
比如:一个商店的交易清单,这里只有豆奶,莴苣,尿布和葡萄酒这四种商品:
上表中{尿布,葡萄酒},{尿布}等就是一个频繁项集, “尿布葡萄酒”为一个关联规则。上表中{尿布,葡萄酒}在整表中占3/5,所以,{尿布,葡萄酒}这个项集的支持度为3/5,{尿布}在整表中占4/5,所以,{尿布}这个项集的支持度为4/5。“尿布
葡萄酒”这个关联规则的可信度为“支持度({尿布,葡萄酒})/支持度({尿布})”,即(3/5)/(4/5)=75%。
2 Apriori原理
以下是4种商品{0,1,2,3}所有可能的项集组合:
Apriori的目的就是找到频繁项集,因为只有先找到频繁项集才能进一步从中挖掘关联规则,最终才能得到大规模数据中有趣的关系。
寻找频繁项集就是去掉一些支持度小的项集。
比如上图中,如果{2,3}这个项集我们算出它的支持度很小,属于非频繁项集,那么显然,所有包括{2,3}项集的项集也是非频繁的,那么也就不用再计算他们的支持度,减少计算量。所以,上图中的{0,2,3},{1,2,3},{0,1,2,3}这三种项集可以去掉。
3 实现
1)生成所有的频繁项集
伪代码:
实现:
def scanD(dataSet, Ck, minSupport):
D=map(set,dataSet)
ssCnt = {}
#记录整个数据集中每个元素出现的次数
#{frozenset([4]): 1, frozenset([5]): 3, frozenset([2]): 3, frozenset([3]): 3, frozenset([1]): 2}
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)) #4
retList = []
supportData = {}
for key in ssCnt: #为每一个ssCnt字典里的元素计算支持度support
support = ssCnt[key]/numItems
if support >= minSupport: #将小于支持度阈值的项集去掉,剩下的当做频繁项集
retList.insert(0,key)
supportData[key] = support
#retList=[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])]
#supportData=
# {frozenset([4]): 0.25, frozenset([5]): 0.75, frozenset([2]): 0.75, frozenset([3]): 0.75, frozenset([1]): 0.5}
return retList, supportData
2)组织完整的Apriori算法
根据支持度,找到频繁项集
伪代码:
实现:
def apriori(dataSet, minSupport = 0.5):
C1 = createC1(dataSet) #数据集中所有大小为1的项集集合
D = map(set, dataSet)
#L1为所有大小为1的频繁项集集合
#supportData为所有大小为1的项集支持度
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while (len(L[k-2]) > 0):
Ck = aprioriGen(L[k-2], k) #由上一层频繁项集,创建下一层所有可能项集组合的集合Ck
Lk, supK = scanD(D, Ck, minSupport)#选择符合支持度的频繁项集Lk
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
3)根据可信度,挖掘关联规则