推荐系统中常用的几种算法:
基于内容的推荐(静态):内容特征表示,特征学习,推荐列表
基于协同过滤的推荐(动态):群体智能、用户历史行为
基于关联规则的推荐:Transaction 频繁项集和关联规则挖掘
基于效率的推荐:效用函数的调用
基于知识图谱的推荐:知识图谱的创建
组合推荐:实际工作中经常使用
关联规则 Association Rules or Basket Analysis
1、 支持度:
百分比,指的是商品组合出现的次数与总次数的比例,支持度越高,代表这个商品出现的频率越大。
‘牛奶’的支持度 = 4/5 =0.8
‘牛奶+面包’ = 3/5 = 0.6
2、 置信度:是个条件概念,指当你买了商品A,会有多大的概率买商品b
置信度(牛奶->啤酒) = 2/4 = 0.5
置信度(啤酒->牛奶) = 2/3 = 0.67
如果我们单纯看置信度(可乐->尿布)= 1,也就是说可乐出现的时候,用户都会购买尿布。那么当用户买可乐的时候,就需要推荐尿布么?答案是否定的,如果该小店以卖尿布为准
3、提升度:商品a的出现,对商品b的出现概率提升程度
提升度(a->b)= 置信度(a->b)/ 支持度(b)
提升度的三种可能:
提升度(a->b)> 1:代表有提升
提升度(a->b)= 1: 代表没有提升也没有下降
提升度(a->b)< 1:代表有下降
4、Apriori算法:就是查找频繁项集(frequent itemset) 的过程
频繁项集(闺蜜):支持度大于等于最小的支持度(MIn Support)阈值的项集
非频繁项集:支持度小于最小支持度的项集
案例
1、上面案例中的商品用ID来表示
假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集
在这个基础上,我们将商品两两组合,得到k=2项的支持度
筛选掉小于最小值支持度的商品组合
将商品进行K=3项的商品组合,可以得到:
筛选掉小于最小值支持度的商品组合
得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。
Apriori算法的流程:
Step1,K=1,计算K项集的支持度;
Step2,筛选掉小于最小支持度的项集;
Step3,如果项集为空,则对应K-1项集的结果为最终结果。
否则K=K+1,重复1-3步。
使用工具包:
from efficient_apriori import apriori
或者:
from mlxtend.frequent_patterns import apriori
代码如下:
关联分析的使用场景,万物皆Transaction:
超市购物小票(TransactionID => Item)
github项目路径:
每部电影的分类(MovieID => 分类)
github项目路径:
每部电影的演员(MovieID => 演员)
github项目路径:
关联规则与协同过滤的区别
关联规则是基于transaction,而协同过滤基于用户偏好(评分)
商品组合使用的是购物篮分析,也就是Apriori算法,协同过滤计算的是相似度
关联规则没有利用“用户偏好”,而是基于购物订单进行的频繁项集挖掘
关联规则与协同过滤的区别
1、推荐使用场景:
当下的需求:
推荐的基础是且只是当前一次的购买/点击
长期偏好:
基于用户历史的行为进行分析,建立一定时间内的偏好排序
两种推荐算法的思考维度不同,很多时候,我们需要把多种推荐方法的结果综合起来做一个混合的推荐
关联规则的视角
不需要考虑用户一定时期内的偏好,而是基于Transaction
只要能将数据转换成Transaction,就可以做购物篮分析:
Step1、把数据整理成id=>item形式,转换成transaction
Step2、设定关联规则的参数(support、confident)挖掘关联规则
Step3、按某个指标(lift、support等)对以关联规则排序
关联规则中的最小支持度、最小置信度该如何确定
最小支持度,最小置信度是实验出来的
最小支持度:
不同的数据集,最小值支持度差别较大。可能是0.01到0.5之间
可以从高到低输出前20个项集的支持度作为参考
最小置信度:可能是0.5到1之间
提升度:表示使用关联规则可以提升的倍数,是置信度与期望置信度的比值
提升度至少要大于1
Apriori在计算的过程中存在的不足:
可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了
每次计算都需要重新扫描数据集,计算每个项集的支持度
浪费了计算空间和时间
FPGrowth算法
在Apriori算法基础上提出了FP-Growth算法:
创建了一棵FP树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。
整个生成过程只遍历数据集2次,大大减少了计算量
理解:Apriori存在的不足,有更快的存储和搜索方式进行频繁项集的挖掘
步骤
创建项头表(item header table)
作用是为FP构建及频繁项集挖掘提供索引。
Step1、流程是先扫描一遍数据集,对于满足最小支持度的单个项(K=1项集)按照支持度从高到低进行排序,这个过程中删除了不满足最小支持度的项。
项头表包括了项目、支持度,以及该项在FP树中的链表。初始的时候链表为空。
Step2、对于每一条购买记录,按照项头表的顺序进行排序,并进行过滤。
构造FP树,根节点记为NULL节点
Step3、整个流程是需要再次扫描数据集,把Step2得到的记录逐条插入到FP树中。节点如果存在就将计数count+1,如果不存在就进行创建。同时在创建的过程中,需要更新项头表的链表。
Step4、通过FP树挖掘频繁项集
现在已经得到了一个存储频繁项集的FP树,以及一个项头表。可以通过项头表来挖掘出每个频繁项集。
挖掘从项头表最后一项“啤酒”开始。
从FP树种找到所有“啤酒”节点,向上遍历祖先节点,得到3条路径。对于每条路径上的节点,其count都设置为“啤酒”的count
具体的操作会用到一个概念,叫“条件模式基”
因为每项最后一个都是“啤酒”,因此我们把“啤酒”去掉,得到条件模式基,此时后缀模式是(啤酒)
假设{啤酒}的条件频繁集为{S1,S2,S3},则{啤酒}的频繁集为{S1+{啤酒},S2+{啤酒},S3+{啤酒}},此时的条件频繁项集为{{}, {尿布}},所以啤酒的频繁项集为{啤酒},{尿布,啤酒}
继续找项头表倒数第2项面包,求得“面包”的条件模式基
根据条件模式基,可以求得面包的频繁项集:{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}
继续找项头表倒数第3项面包,求得“牛奶”的条件模式基
根据条件模式基,可以求得面包的频繁项集:{牛奶},{尿布,牛奶}
继续找项头表倒数第4项面包,求得“尿布”的条件模式基
根据条件模式基,可以求得尿布的频繁项集:{尿布}
所以全部的频繁项集为:
{啤酒},{尿布,啤酒}
{面包},{尿布,面包},{牛奶,面包},{尿布,牛奶,面包}
{牛奶},{尿布,牛奶}
{尿布}
工具包
通过Python官方的第三方软件库
https://pypi.org/
import fptools as fp
Spark.mllib 提供并行FP-growth算法