zoukankan      html  css  js  c++  java
  • 频繁项挖掘算法Apriori和FGrowth

    一:背景介绍

      最近在公司用spark的平台做了一个购物车的推荐,用到的算法主要是FGrowth算法,它是Apriori算法的升级版,算法的主要目的是找出频繁进行一起购买的商品。本文主要介绍两个算法的背景,触及到公司的推荐具体流程,这里就不介绍了。

    二:Apriori

      Apriori算法是挖掘频繁项的基础算法,通过挖掘用户购买订单,发现频繁一起购买的商品集合。它采用一种逐层搜索的迭代方法,用k项集来搜索(k+1)项集。首先通过扫描数据中的订单,累计每项的计数,收集满足最小支持度的项,找出1项集的集合L1,然后用L1来找出频繁2项集的集合L2,使用L2再找出L3,如此循环下去。了解这个算法,有个两个概念需要了解的:支持度和置信度

            支持度: support(A=>B)=P(A*B) 表示数据库事务中包含A和B的概率

            置信度: confidence(A=>B)=P(B|A) 表示在A发生的情况下B发生的概率

      下面用具体例子来理解aprior,某个商场的交易数据中保存如下数据:

    交易ID

    商品ID列表

     

    交易ID

    商品ID列表

    T100

    I1,I2,I5

     

    T600

    I2,I3

    T200

    I2,I4

     

    T700

    I1,I3

    T300

    I2,I3

     

    T800

    I1,I2,I3,I5

    T400

    I1,I2,I4

     

    T900

    I1,I2,I3

    T500

    I1,I3

         

      1.1.第一遍,扫描所有的事务,对每个商品出现次数统计

      1.2.假设我们指定的支持度为2,则频繁一项集L1,它由大于支持度2的1项集组成,第一遍扫描数据库产生1项集L1,统计结果为:

    项集

    支持度计数

    {I1}

    6

    {I2}

    7

    {I3}

    6

    {I4}

    2

    {I5}

    2

    每个项集的支持度更指定的支持度比较,在指定支持度以上的保留,这里大于支持度为2的,进行保留,得到:

    项集

    支持度计数

    {I1}

    6

    {I2}

    7

    {I3}

    6

    {I4}

    2

    {I5}

    2

     

      1.3.由L1项集自连接产生2项集L2,然后扫描数据库,得到此2项集在事务中的支持度

    项集

    支持度计数

    {I1,I2}

    4

    {I1,I3}

    4

    {I1,I4}

    1

    {I2,I3}

    2

    {I2,I3}

    4

    {I2,I4}

    2

    {I2,I5}

    2

    {I3,I4}

    0

    {I3,I5}

    1

    {I4,I5}

    0

    大于支持度为2的保留

    项集

    支持度计数

    {I1,I2}

    4

    {I1,I3}

    4

    {I2,I3}

    2

    {I2,I3}

    4

    {I2,I4}

    2

    {I2,I5}

    2

    {I3,I5}

    1

      1.4 由2项集L2自连接产生3项集L3,然后扫描数据库,此3项集在事务中的支持度

    项集

    支持度计数

    {I1,I2,I2}

    2

    {I1,I2,I5}

    2

    保留支持度大于2的3项集,所有之类全部保留下来,得到满足2支持度的3项集:

    项集

    支持度计数

    {I1,I2,I2}

    2

    {I1,I2,I5}

    2

      1.5有频繁项来产生关联规则

    当用apriori算法找出频繁项集之后,可以用他们来产生关联规则,关联规则的计算方式为: 

    P(A|B)=P(AB)/P(B)

    即当B发生时,A发生的概率。我们可以用这个来进行推荐,如果我们指定置信度为70%,当P(A|B)>=70%时,我们将在客户买A商品是给他推荐B商品,例如当有个顾客买了把{I1,I2}放进购物车了,我们应该给她推荐什么商品呢?

    我们来计算{I1,I2}=>{I5}的概率,即当他把{I1,I2}放进购物车了,我们给他推荐商品{I5}的概率,这里计算的到

    置信度为:2/4=50%

    即他有50%的概率会选者I5,到底推不推,看你设置的最小置信度了,如果大于你设置的最小置信度则推。

    算法缺点:

    每次由(k-1)项集L(K-1)产生K项集L(K)时,自连接产生采用枚举的方式,而且产生的项集每次都得去扫描一下数据库

    如何提高Apriori算法的效率,有比较多的方法:基于散列,抽样等方式,比较出名的改进算法有FPGrowth算法

    由于感觉这里篇幅比较长了,FGrowth算法放到下一篇文章中介绍,点击下面的链接查看

    http://www.cnblogs.com/aijianiula/p/5398179.html

  • 相关阅读:
    ArrayList集合封装 类 并通过方法调用
    ArrayList集合的基本操作
    方法的重复定义和重载
    方法间值的传递,二维数组的定义和遍历
    赋值运算,逻辑运算符,引用数据类型
    Javase;jdk的安装调试;基础语法和变量以及基础数据类型
    E-R画图规则和数据库设计的三大范式
    sql多表查询和子查询
    sql约束的使用
    sql表操作的基础语法
  • 原文地址:https://www.cnblogs.com/aijianiula/p/5397857.html
Copyright © 2011-2022 走看看