【关联分析】Apriori和FP-growth的算法原理和Python实现

在机器学习的无监督问题中,常使用关联分析法来发现存在于大量数据集中的关联性或相关性。关联分析是从大量数据中发现项集之间的关联和相关联系,从而描述一个事物中某些属性同时出现的规律和模式。

关联分析的一个典型例子是超市购物分析,通过分析顾客购物车中的不同商品之间的联系、哪些商品会被频繁地同时购买,即“哪些商品经常被同时购买?”,来制定超市商品的营销策略等。经典的关联分析方法有Apriori算法和FP-growth算法。

目录

1、关联分析

2. Apriori算法

2.1 Apriori原理

2.2 使用Apriori算法来发现频繁集

2.3 Python代码实现

3. FP-growth

3.1 构建FP树

3.2 挖掘频繁项集

3.3 Python代码实现


1、关联分析

关联分析是指从大规模数据集中训练物品间的隐含关系,也称为关联规则学习。关联分析的目标包括发现以下两点:① 频繁项集 ② 关联规则
① 频繁项集:经常一起出现的物品集合
② 关联规则:暗示两种物品之间可能存在很强的关系

举一个例子:

交易号码 商品
1 豆奶,面包
2 面包,尿布,啤酒,甜菜
3 豆奶,尿布,啤酒,橙汁
4 面包,豆奶,尿布,啤酒
5

面包,豆奶,尿布,橙汁

  • 频繁项集 (frequent item sets):经常出现在一起的商品集合。
  • 关联规则 (rule):先决条件->结果。如上例中的{啤酒,尿布},可以推断如果这名顾客买了尿布,那么也可能购买啤酒。
  • 支持度 (support):定义数据集中包含该项集的记录所占的比例。如上例中{豆奶}的支持度为\frac{4}{5},{豆奶,尿布}的支持度为\frac{3}{5}
  • 可信度或置信度 (confidence):针对关联规则定义的,X发生时Y也发生的概率,即条件概率。比如,规则{尿布}->{啤酒}的可信度为\frac{support({diaper,peer})}{support({diaper})}。意思是,{尿布,啤酒}的支持度为\frac{3}{5},{尿布}的支持度为\frac{4}{5},那么顾客买了尿布后可能会一起买啤酒的可信度为\frac{3}{4}

2. Apriori算法

Apriori算法是一个很经典的数据挖掘算法,很多算法都是基于Apriori产生的,如FP-Tree、GSP、CBA等。

2.1 Apriori原理

可以通过枚举法列出所有的可能子集,但当数据集很大时,枚举法并不是个高效的方法。如图1所示,对于一个有4个项(假设超市卖4种商品),那么共有15个项集。

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Apriori算法FP-Growth算法都是关联规则挖掘中常用的算法Apriori算法原理是通过不断扫描数据集,找出频繁项集,然后由频繁项集产生候选规则,再通过支持度和置信度筛选出强规则。Apriori算法的缺点是需要不断扫描数据集,计算频繁项集,效率较低。 FP-Growth算法原理是通过构建FP树来表示数据集,然后通过递归的方式挖掘频繁项集。FP-Growth算法的优点是只需要扫描两次数据集,不需要产生候选项集,效率较高。 以下是两个算法Python实现: 1. Apriori算法 ```python 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 list(map(frozenset, C1)) def scanD(D, Ck, minSupport): ssCnt = {} for tid in D: for can in Ck: if can.issubset(tid): if not can in ssCnt: 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 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 = 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 ``` 2. FP-Growth算法 ```python class treeNode: def __init__(self, nameValue, numOccur, parentNode): self.name = nameValue self.count = numOccur self.nodeLink = None self.parent = parentNode self.children = {} def inc(self, numOccur): self.count += numOccur def disp(self, ind=1): print(' '*ind, self.name, ' ', self.count) for child in self.children.values(): child.disp(ind+1) def createTree(dataSet, minSup=1): headerTable = {} for trans in dataSet: for item in trans: headerTable[item] = headerTable.get(item, 0) + dataSet[trans] for k in list(headerTable.keys()): if headerTable[k] < minSup: del(headerTable[k]) freqItemSet = set(headerTable.keys()) if len(freqItemSet) == 0: return None, None

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值