基于关联规则的推荐,是推荐系统中常用的算法之一;只要我们能将数据转换成Transaction(交易),就可以做购物篮分析。
1.算法背景
为什么将关联规则与购物篮分析放在一起,这将要从该算法最早出现的案例说起!这便是大家耳熟能详的啤酒与尿布的故事。
“啤酒与尿布”的故事产生于 20 世纪 90 年代的美国沃尔玛超市。沃尔玛的超市管理人
员分析销售数据时发现了一个令人难于理解的现象:在某些特定的情况下,“啤酒”与“尿
布”两件看上去毫无关系的商品会经常出现在同一个购物篮中,这种独特的销售现象引起了
管理人员的注意,并进行了后续的调查。
原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上
为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。这样就会出现啤酒与
尿布这两件看上去不相干的商品经常会出现在同一个购物篮的现象。如果年轻的父亲在卖场只能买到两件商品之一,则他很有可能会放弃购物而去另一家商场,直到可以一次同时买到啤酒与尿布为止。沃尔玛发现了这一独特的现象,开始在卖场尝试将啤酒与尿布摆放在相同的区域,让年轻的父亲可以同时找到这两件商品,并很快地完成购物;而沃尔玛超市也可以让这些客户一次购买两件商品、而不是一件,从而获得了很好的商品销售收入。
一句话概括上面的故事:沃尔玛在分析销售记录时,发现啤酒和尿布经常一起被购买,于是他们调整了货架,把两者放在一起,结果真的提升了啤酒的销量。那么具体的过程是如何分析的呢?
2.关联分析问题
首先,该商品组合会经常出现,我们对其分析才有价值,较低概率的事件没有分析的意义。专业术语,支持度。 支持度:指的是某个商品组合出现的次数与总次数之间的比例,是个百分比。支持度越高,代表这个组合出现的频率越大。
以下面的5个订单/购物篮为例:
订单编号 | 购买的商品 |
1 | 牛奶 1、面包 2、尿布 3 |
2 | 可乐4、面包2、尿布3、啤酒5 |
3 | 牛奶1、尿布3、啤酒5、鸡蛋6 |
4 | 面包2、牛奶1、尿布3、啤酒5 |
5 | 面包2、牛奶1、尿布3、可乐4 |
可以尝试计算每一件商品或每一个组合的支持度。
例 牛奶 4/5=0.8 牛奶+面包 3/5=0.6
那虽然组合的支持度很高,那么依靠A推送B的可靠性有多大?这就引出了置信度,即在购买A的情况下,购买B的概率有多大。【第3部分会补充相应的数学理论】
依然是上面的购物篮,置信度(牛奶→面包) 3/4=0.75 置信度(面包→牛奶) 3/4=0.75 除此之外,我们发现置信度(可乐→尿布)=1 !!!那么我们需要在用户购买可乐的时候,推荐尿布吗???
此时就出现了第3个比较重要的概念,提升度。提升度:商品A的出现,对商品B的出现概率提升的程度。公式:提升度(A→B)=置信度(A→B)/支持度(B)
当然,我们要在商品A出现的时候,推荐商品B,肯定是希望A能够对B出现的概率有所提升。即置信度>支持度。总结为:
提升度(A→B)>1:代表有提升;
提升度(A→B)=1:代表有没有提升,也没有下降;
提升度(A→B)<1:代表有下降。
综上,其实我们的关联规则推荐就是要找到出现概率较高的组合,且其中一个或多个元素的出现,对其它元素的出现会有概率的提升。 这个“其它元素”就是我们挖掘出来的要进行推荐的元素。
通过上述讲解,我们不难理解关联规则推荐的相关原理了,接下来,我们进行一下总结,也就是这篇文章的第三部分,也是这篇文章的最后一个部分:Apriori算法原理。
3.Apriori算法原理
在上面的讲解中,我们一方面要找到出现概率较高的组合[频繁项集的概念],另一方面我们需要其它元素对推荐元素的出现概率的提升。这要求我们在模型训练的时候,需要规定最小的支持度和最小的提升度。
项集:其实就是物品的集合;频繁项集:支持度大于等于最小支持度阈值的项集。对应的还有非频繁项集。
Apriori算法就是查找频繁项集的过程。
同样的还是上面的订单,我们来查找一下频繁项集,首先我们设置最小支持度0.5。
订单编号 | 购买的商品 |
1 | 牛奶 1、面包 2、尿布 3 |
2 | 可乐4、面包2、尿布3、啤酒5 |
3 | 牛奶1、尿布3、啤酒5、鸡蛋6 |
4 | 面包2、牛奶1、尿布3、啤酒5 |
5 | 面包2、牛奶1、尿布3、可乐4 |
此处,为方便统计商品进行ID的设置。
最小项集[包含一个元素]
商品项集 | 支持度 |
1 | 4/5 |
2 | 4/5 |
3 | 5/5 |
4 | 2/5 |
5 | 3/5 |
6 | 1/5 |
标红的为非频繁项集,其所在的更多元素的项集,支持度会小于等于它的项集。故它所在的更多元素的项集排除了4,6
二项集
故1,5 2,5 为非频繁项集
三项集
排除掉含有4和6的,排除掉同时含1,5或2,5,三项集只有1,2,3
商品项集 | 支持度 |
1,2,3 | 3、5 |
以上即是Apriori算法的流程
Step1,K=1,计算K项集的支持度;
Step2,筛选掉小于最小支持度的项集;
Step3,如果项集为空,则对应K-1项集的结果为最终结果。
否则K=K+1,重复1-3步。
其中涉及到的数学原理以及主要算法实现,我将在接下来的文章中继续讲述。希望我们相互学习,共同进步。