一:背景介绍

  最近在公司用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

05-11 19:58