5.1 基于关联规则的推荐算法
关联规则是数据挖掘领域非常经典的算法,该算法可用一个故事—“啤酒与尿布”来讲解。该故事发生在20世纪90年代的美国沃尔玛超市中,沃尔玛的超市管理人员分析销售数据时发现了一个令人难以置信的现象:在某些特定的情况下,“啤酒”与“尿布”两件看上去毫无关系的商品会经常出现在同一个购物篮(用户一次购物所买的所有商品被形象地称为一个购物篮)中,这种独特的销售现象引起了管理人员的注意,经过后续调查发现,这种现象出现在年轻的父亲身上。
在有婴儿的美国家庭中,一般是母亲在家中照看婴儿,年轻的父亲前去超市购买尿布。父亲在购买尿布的同时,往往会顺便为自己购买啤酒,这样就会出现啤酒与尿布这两件看上去毫不相干的商品经常会出现在同一个购物篮的现象。沃尔玛发现了这一独特的现象,开始尝试在卖场将啤酒与尿布摆放在相同的区域,让年轻的父亲可以方便地同时找到这两件商品,并很快地完成购物。
下面我们给出关联规则的定义,假设P={p1,p2,p3,…,pn}是所有标的物的集合(对于沃尔玛超市来说,就是所有商品的集合)。关联规则一般表示为X⇒Y的形式,其中X、Y是P的子集,并且X∩Y=φ。关联规则X⇒Y表示如果X在用户的购物篮中,那么用户有很大概率同时购买了Y。通过定义关联规则的度量指标,一些常用的关联规则算法(如Apriori)能够自动地发现所有关联规则。关联规则的度量指标主要是指支持度(support)和置信度(confidence),支持度是指所有的购物篮中包含的比例(即X,Y同时出现在一次交易中的概率),而置信度是指购物篮中包含X同时也包含Y的比例(即在X给定的情况下,Y出现的条件概率)。它们的定义如下:
支持度越大,包含X∪Y的交易样本越多,说明关联规则X⇒Y有更多的样本来支撑,“证据”更加充分。置信度越大,我们更有把握从包含X的交易中推断出该交易也包含Y。在关联规则挖掘中,我们需要挖掘出支持度和置信度大于某个阈值的关联规则,这样的关联规则才更可信,更有说服力,泛化能力也更强。
有了关联规则的定义,下面来讲解怎样将关联规则用于个性化推荐中。对于推荐系统来说,一个购物篮即是用户操作过的所有标的物的集合。关联规则X⇒Y表示的意思是如果用户操作过X中的所有标的物,那么用户很可能会喜欢Y中的标的物。基于上述说明,利用关联规则为用户u生成推荐的算法流程如下(假设u所有操作过的标的物集合为A)。
1)挖掘出所有满足一定支持度和置信度(支持度和置信度大于某个常数)的关联规则X⇒Y;
2)从挖掘出的所有的关联规则中筛选出所有满足X⊆A的关联规则X⇒Y;
3)为用户u生成推荐候选集,具体计算如下:
即将所有满足流程2)的关联规则X⇒Y中的Y合并,并剔除掉用户已经操作过的标的物,这些标的物就是待推荐给用户u的。对于流程3)中的推荐候选集S,可以按照该标的物所在关联规则的置信度的大小降序排列,对于多个关联规则生成同样的候选推荐标的物的,可以用置信度最大的那个关联规则的置信度。除了可以采用置信度外,也可以用支持度和置信度的乘积作为排序依据。对于流程3)中排序好的标的物,可以取topN作为推荐给用户u的推荐结果。
基于关联规则的推荐算法思路非常简单朴素,也易于实现,Spark MLlib中有关联规则的两种分布式实现FP-Growth和PrefixSpan,大家可以直接拿来使用(关于这两个关联规则挖掘算法的实现细节,读者可以阅读本章参考文献[10][11][12]。
关于关联规则算法的介绍及怎么利用关联规则进行个性化推荐,还可以阅读本章参考文献[4],[5],[6],[7],[8],[9]。利用关联规则做推荐,是从用户的过往行为中挖掘用户的行为模式,并用于推荐,由于只用到了用户的行为数据,因此利用关联规则做推荐也是一种协同过滤算法。