FP-Growth算法

  • 概述
  • 阶段1:FP树构建
  • 步骤1:清洁和分类
  • 步骤2:构造FP树,带有已清理项目集的头表
  • 阶段2:开采主要树和条件FP树
  • 步骤1:将主要FP树划分为条件FP树
  • 步骤2:递归地挖掘每个条件树
  • 使用SPARK实现算法



FP树是整个FP Growth算法的核心概念。简而言之,FP树是项集数据库的压缩表示形式。树结构不仅在数据库中保留了项目集,而且还跟踪项目集之间的关联


通过获取每个项目集并将其一次映射到树中的路径来构造树。这种结构背后的整个想法是发生频率更高的项集将有更好的机会共享项集


然后,我们递归地挖掘树以获得频繁模式。模式增长,即算法的名称,是通过连接从条件FP树生成的频繁模式来实现的。


frdemo数据库在哪个文件夹 fp数据库_算法

概述

FP增长之所以如此高效,是因为它是一种分而治之的方法。而且我们知道,高效的算法必须利用某种数据结构和先进的编程技术。它实现了树,链接列表以及深度优先搜索的概念。该过程可以分为两个主要阶段,每个阶段可以进一步分为两个步骤。

阶段1:FP树构建

步骤1:清洁和分类

对于每笔交易,我们首先删除低于最低支持量的项目。然后,我们以频率支持降序对项目进行排序。

frdemo数据库在哪个文件夹 fp数据库_spark_02

步骤2:构造FP树,带有已清理项目集的头表

循环浏览已清理的项目集,一次将其映射到树上。如果分支中已存在任何项目,则它们共享同一节点,并且计数增加。否则,该项目将位于创建的新分支上。

标头表也在此过程中构造。交易中每个唯一项目都有一个链接列表。通过链接列表,我们可以在短时间内找到该项目在树上的出现,而无需遍历树。

frdemo数据库在哪个文件夹 fp数据库_spark_03

阶段2:开采主要树和条件FP树

步骤1:将主要FP树划分为条件FP树

从每个频繁出现的1个模式开始,我们在FP树中创建带有前缀集的条件模式基础 。然后,我们使用这些模式库以与阶段1中完全相同的方法来构造条件FP树。

步骤2:递归地挖掘每个条件树

频繁模式是从条件FP树生成的。为一种频繁模式创建了一个条件FP树。我们用来挖掘条件树的递归函数接近深度优先搜索。它可以确保在继续进行操作之前,不再可以使用剩余的项目构建树。

使用SPARK实现算法

Spark中已经提供FTProwth的算法实现,实现起来非常简单,主要有两个参数
支持度(MinSupport)和置信度(MinConfidence).

public void fpgrowth(SparkSession sparkSession) {
        List<Row> data = Arrays.asList(
                RowFactory.create(Arrays.asList("1 2 5".split(" "))),
                RowFactory.create(Arrays.asList("1 2 3 5".split(" "))),
                RowFactory.create(Arrays.asList("1 2".split(" ")))
        );
        StructType schema = new StructType(new StructField[]{new StructField(
                "items", new ArrayType(DataTypes.StringType, true), false, Metadata.empty())
        });
        Dataset<Row> itemsDF = sparkSession.createDataFrame(data, schema);

        FPGrowthModel model = new FPGrowth()
                .setItemsCol("items")
                .setMinSupport(0.5)
                .setMinConfidence(0.6)
                .fit(itemsDF);

        // 展示频繁项集
        model.freqItemsets().show();

        // 显示生成的关联规则
        model.associationRules().show();

        // 根据所有关联规则检查输入项,并将结果总结为预测
        model.transform(itemsDF).show();
    }