一、FP-Growth算法代码
def createTree(dataSet, minSup=1): #FP树构建函数
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 #如果不存在满足条件的元素项,则退出
for k in headerTable:
headerTable[k] = [headerTable[k], None] #扩展头指针表以便可以保存计数值及指向每种类型第一个元素项的指针
retTree = treeNode('Null Set', 1, None) #树的根节点
for tranSet, count in dataSet.items(): #第二次遍历数据集
localD = {}
for item in tranSet: #对于每个元素项,检查其是否是频繁项集中的一员,如果不是,则删除。
if item in freqItemSet:
localD[item] = headerTable[item][0]
if len(localD) > 0: #根据全局频率对每个事务中的元素排序
orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p: p[1], reverse=True)]
updateTree(orderedItems, retTree, headerTable, count) #使用排序后的频率项集对树进行填充
return retTree, headerTable #返回树和头指针表
二、FP-Growth算法
FP-Growth算法是一种基于Apriori算法的无序频繁项集挖掘算法,使用前缀树(也称为前缀路径树或FP树)数据结构来存储以一种压缩的方式来表示数据集中的共现模式。与Apriori算法相比,它不需要候选集和关联规则的生成过程,从而大大减少了计算时间,能够处理大规模数据集,并提高了性能。我们可以将FP-Growth算法的流程分为以下步骤:
三、FP-Growth和Apriori对比
- 算法时间复杂度
FP-Growth算法只需要遍历数据集两次,而Apriori算法需要多次遍历数据集,FP-Growth算法时间复杂度更低,尤其当支持度较高且数据集非常庞大时,优势更加明显。 - 挖掘性能
FP-Growth算法通过数据量的压缩和树结构的维护使得挖掘性能优于Apriori算法。FP-Growth算法生成了一颗前缀树,这样可以避免了生成大量的候选项集,从而提高了关联规则的挖掘效率。 - 系统开销
使用FP-Growth算法的系统开销较小,但由于需要占用一定的磁盘空间,因此Apriori算法对于对内存的需求较小。
四、FP-Growth算法的应用场景
- 销售领域:可以通过对销售数据进行挖掘,发现产品之间的相关关系,优化销售策略,提高销售效率和产品粘性。
- 推荐系统:可以通过对用户行为数据的挖掘,发现用户之间的相同行为模式,从而提升推荐的效果,优化推荐算法。
- 社交网络领域:可以对社交网络中用户之间的社交关系进行挖掘,发现用户之间的共同兴趣爱好,从而向用户推荐更加精准的内容,提高用户体验。