Apriori算法也属于无监督学习,它强调的是“从数据X中能够发现什么”。从大规模的数据集中寻找物品之间隐含关系被称为关联分析或者称为关联规则学习。这里的主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索并不能解决这个问题。因此此处介绍使用Apriorio算法来解决上述问题。
1:简单概念描述
(1) 频繁项集:指经常出现在一块的物品的集合。 关联规则暗示两种物品之间存在很强的关系。(这里我们事先定义阀值,超过该阀值,证明两者之间存在很强的关系).
(2) 一个项集的支持度(support)被定义为数据集中包含该项集的记录所占的比例。我们事先需要定义一个最小支持度(minSupport),而只保留满足最小支持度的项集。
(3) 可信度或置信度(confidence)是针对一条诸如{尿布}->{葡萄酒}的关联规则来定义的。
(4) Apriori的原理是如果某个项集是频繁的,那么它的子集也是频繁的。反过来说,如果一个项集是非频繁的,那么它的所有超集也是非频繁的。比如{1,2}出现的次数已经小于最小支持度了(非频繁的),那么超集{0,1,2}的组合肯定也是非频繁的了。主要包括发现频繁项集和挖掘关联规则这两步。
2:发现频繁项集
过程是:从C1= { {0},{1},{2},{3}}开始,然后生成L1,L1是C1中项集的支持度大于等于最小支持度,比如L1 = { {0},{1},{3}}。然后由L1组合得到C2 = { {01},{03},{13}}。一直进行下去直到Ck为空。
# 加载数据
def loadDataSet():
return [[1,3,4], [2,3,5], [1,2,3,5], [2,5]]
# 创建C1
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) #frozenset 可以将集合作为字典的键字使用
# 由Ck生成Lk
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 = []
suppo