Apriori算法和FP-growth算法

本文深入探讨了关联规则挖掘中的经典算法Apriori和FP-growth。Apriori算法通过多次扫描数据库产生频繁集,而FP-growth算法利用树形结构直接获取频繁集,减少了扫描次数,提升了效率。文章详细介绍了两种算法的原理、步骤及特点。
经典的关联规则挖掘算法包括Apriori算法和FP-growth算法。
apriori算法多次扫描交易数据库,每次利用候选频繁集产生频繁集;而FP-growth则利用树形结构,无需产生候选频繁集而是直接得到频繁集,大大减少扫描交易数据库的次数,从而提高了算法的效率。但是apriori的算法扩展性较好,可以用于并行计算等领域。
使用Apriori算法进行关联分析。FP-growth算法来高效发现频繁项集。


* Apriori算法
  * 根据支持度进行频繁项集的挖掘,根据置信度进行规则的产生
  * 算法原理:根据候选一项集数据库第一次扫描去掉低于最小值支持度计数的项得到频繁一项集,在根据候选2项集再次扫描数据库得到频繁2项集,在根据候选3项集得到频繁3项集,依次类推。
  * 算法步骤:
    * 首先,拿到数据集进行数据库扫描得到候选1项集,在通过设定一个最小支持度技术得到频繁1项集
    * 再次扫描数据库根据候选2项集得到频繁2项集,依次类推
    * 得到频繁项集,根据置信度来计算规则的产生
    * 设定一个置信度阈值,如果小于置信度阈值,直接筛选掉,否则选择作为关联规则
  * 算法特点:
    * 产生-测试:产生是候选项集,测试的是频繁项集
    * Apriorii算法如果得到是频繁K项集会进行K次扫描数据库
  * 工作中:
    * 进行关联挖掘

* FP-Growth算法
  * 根据支持度进行频繁项集的挖掘,根据置信度进行规则的产生
  * 算法原理:首先扫描一次数据库,筛选掉不符合最小支持度计数的1项集,根据支持度进行排序,得到新的经过排序后的数据,再进行构建FP树,在根据后缀节点寻找前缀路径从而得到频繁项集
  * 算法步骤:
    * 首先扫描一次数据库,筛选掉不符合条件的最小支持度计数的1项集,得到频繁1项集
    * 再次根据支持度计数进行对数据集进行排序,得到排序后的结果,再次进行FP树的构建
    * 根据后缀节点寻找前缀路径中是频繁项集的集合
  * 算法特点:
    * 只需要扫描两次数据库
    * 如果树的分支节点非常多的时候树的复杂度很高
  * 工作中:
    * 进行关联挖掘
    * 在Spark中的FPGrowth算法中直接使用API接口进行大数据量的关联挖掘推荐






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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值