应用
用于挖掘频繁项集及关联规则
可用于推荐系统, 通过不同顾客购物车的商品,分析顾客的习惯,从而对不同顾客进行商品推荐等
概念通俗理解
- 项集及K项集
将商品作为项;
每个顾客的购物车的商品集就是一个项集;
若顾客购物车有k项商品,则称这个项集为k项集。 - 支持度计数
用来表示项集出现的频繁次数;
整个统计数据中,顾客购物车的商品集相同的次数,即多少顾客的购物车的商品集相同;
(牛奶,面包)在整个数据集中出现的次数 - 关联规则
大致可以描述为用来衡量商品之间的相关性;
如,面包->牛奶 :顾客购买面包,同时购买牛奶的概率大小等
- 衡量关联规则强度的两个参数
支持度:包含(面包,牛奶)的购物车数量 / 系统中所有购物车数量
置信度:包含(面包,牛奶)的购物车数量 / 包含面包的购物车数量
支持度用来衡量项集的频繁程度,置信度用来衡量规则的强弱。
- 衡量关联规则强度的两个参数
- 频繁项集:支持度大于给定阈值的项集,如(面包,牛奶)的支持度大于规定的支持度阈值,则成(面包, 牛奶)为频繁项集,即出现足够频繁的项集称频繁项集。
- 到此回归Aprior算法的应用:用于寻找频繁项集及关联规则
- 项集性质:
频繁项集的非空子集也是频繁的,如(面包,牛奶)为频繁项集,则(面包)及(牛奶)均为频繁项集。
因此可知非频繁项集的超集也是非频繁的,如(面包)为非频繁项集,则(面包,牛奶)为非频繁项集 。
原因:项集包含项数越多,则项集的支持度越小,如(牛奶,面包)出现次数一定小于(牛奶)及(面包)痴线次数。
Aprior算法原理
主要分两部:连接;剪枝
首先寻找1-项集中所有频繁项集,然后通过连接1-项集得到2-项集,在通过剪枝删除2-项集中的非频繁项集,从而得到2项集中所有的频繁项集;再通过连接得到3-项集,再通过剪枝得到3-项集中的频繁项集,… ,直至得到k-项集为空集,停止寻找。
连接:
定义Lk为k-项集中所有的频繁项集集合,Ck为所有的k-项集集合。首先要由Lk得到Ck+1,将Lk中只有一项不相同的项集进行求并集,从而得到k+1-项集。已知Lk,Lk集合中每个项集均包含k项,即Lk_i = {i1, i2, …, ik},假设项集中的元素(项)按顺序排列(如牛奶是第一项,面包第二项,不会出现面包出现在牛奶前的项集)。当两个k-项集中的前k-1项相同,最后一项不相同时,将此两个项集求并集,进而得出一个k+1项集。实现:
# 程序只是实现的大体流程
# k为项集包含的项数
def combination(Lk, k):
Ckp1 = []
for i in range(len(Lk)):
for j in range(i+1, len(Lk)):
if Lk[i][:k-2] == Lk[j][:k-2]:
ckp1.append(list(Lk[i]|Lk[j]))
return ckp1
- 剪枝
由连接得到Ck+1,即k+1项集的集合,其中包含了频繁项集和非频繁项集,剪枝操作就是去除Ck+1中左右的非频繁项集,从而得到Lk+1。
判断项集是非频繁项集的标准:
1,判断其子集中是否存在非频繁项集;
2,计算其支持度是否小于阈值
其中标准1,求取Ck+1每个项集的所有子k-项集,遍历Lk,若有子项集不存在Lk中,则Ck+1中的该项集为非频繁项集,因此删除该项集。
对剩余Ck+1的项集进行支持度计算,去除置信度小于阈值的项集
关于为什么使用1,本人想法,因为计算置信度需要统计整个数据集中单个项集发生的次数,数据集很大,以至于遍历需要的时间复杂度很高,因此采用第一步,能够去除很大一部分非频繁项集,从而提高效率。
参考文献
https://blog.csdn.net/hjimce/article/details/45438507
https://blog.csdn.net/zhazhayaonuli/article/details/53322541?locationNum=15&fps=1