这次我们介绍商品推荐系统:
- 推荐系统是什么
- 推荐引擎的分类
- 常见的推荐算法
- 混合的推荐机制(重要)
- 推荐系统架构
- 协同过滤的实现
推荐引擎解决的几个问题
- 主动的用户,通过类目和搜索进行引导,对结果页进行干预
- 被动的用户,通过用户的历史行为分析,推荐用户可能感兴趣的商品。
- 对商家来讲,帮助商家卖出更多的东西
推荐系统是什么
目的
为了解决信息过载和用户无明确需求的问题,找到用户感兴趣的物品,才有了个性化推荐系统。
- 分类目录和搜索引擎,解决信息过载的问题,代表性的解决方案是分类目录和搜索引擎,如hao123,电商首页的分类目录以及百度,360搜索等。
不过分类目录和搜索引擎只能解决用户主动查找信息的需求,即用户知道自己想要什么,并不能解决用户没用明确需求很随便的问题。
经典语录是:你想吃什么,随便!面对这种很随便又得罪不起的用户(女友和上帝),只能通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。比如问问女友的闺蜜,她一般什么时候喜欢吃什么。 - 推荐系统广泛存在于各类网站中,作为一个应用为用户提供个性化的推荐。它需要一些用户的历史数据,一般由三个部分组成:
- 基础数据
包括用户的访问、浏览、下单、收藏,用户的历史订单信息,评价信息等很多信息; - 推荐算法系统推荐算法系统主要是根据不同的推荐诉求由多个算法组成的推荐模型;
- 前台展示,前台展示主要是对客户端系统进行响应,返回相关的推荐信息以供展示。
- 基础数据
推荐引擎的分类
推荐引擎的分类可以根据很多指标进行区分:
常规分类
- 根据大众行为的推荐引擎
根据大众行为的推荐引擎,对每个用户都给出同样的推荐,这些推荐可以是静态的由系统管理员人工设定的,或者基于系统所有用户的反馈统计计算出的当下比较流行的物品。(销售排行榜、关注排行榜、好评排行榜) - 个性化推荐引擎,对不同的用户,根据他们的口味和喜好给出更加精确的推荐,这时,系统需要了解需推荐内容和用户的特质,或者基于社会化网络,通过找到与当前用目标用户进行户相同喜好的用户,实现推荐。
根据数据源进行区分
根据数据源进行区分:主要是根据数据之间的相关性进行推荐,因为大部分推荐引擎的工作原理还是基于物品或者用户的相似集进行推荐。
- 根据系统用户的基本信息发现用户的相关程度,这种被称为基于人口统计学的推荐(Demographic-based Recommendation)
- 根据推荐物品或内容的元数据,发现物品或者内容的相关性,这种被称为基于内容的推荐(Content-based Recommendation)
- 根据用户对物品或者信息的偏好,发现物品或者内容本身的相关性,或者是发现用户的相关性,这种被称为基于协同过滤的推荐
常见的推荐算法
迄今为止,在个性化推荐系统中,协同过滤技术是应用最成功的技术。目前国内外有许多大型网站应用这项技术为用户更加智能(个性化、千人千面)的推荐内容。
我们主要介绍协同过滤算法
基于用户的协同过滤算法
第一代协同过滤技术是基于用户的协同过滤算法,基于用户的协同过滤算法在推荐系统中获得了极大的成功,但它有自身的局限性。
基于用户的协同过滤算法先计算的是 用户与用户的相似度(兴趣相投,人以群分物以类聚),然后将相似度比较接近的用户A购买的物品推荐给用户B,专业的说法是该算法用最近邻居(nearest-neighbor) 算法找出一个用户的邻居集合,该集合的用户和该用户有相似的喜好,算法根据邻居的偏好对该用户进行预测。
-
用户的购买记录
张三购买过,橘子,橙子、苹果、手机、卫生纸
王五购买过,橘子,橙子、苹果、手机、
李四购买过,橘子,橙子、苹果
张三和王五的相似度 4分
张三和李四的相似度 3分
王五和李四的相似度 3分 -
给李四进行推荐
与李四相似的用户是张三和王五,他们 购买记录的汇总结构是
橘子,橙子、苹果、手机、卫生纸
去除已经重复购买过的物品,我们给李四推荐如下产品:
手机、卫生纸 -
冷启动问题:
由于基于用户的协同过滤算法是基于用户购买过的商品进行推荐,只有已经被用户选择(购买)的物品才有机会推荐给其他用户。对于一次都没有被购买过的商品,是一个巨大灾难,没机会出头了。 -
计算量大的问题:
对于一个拥有千万级活跃用户的电商网站来说,每计算一个用户都涉及到了上亿级别的计算。 -
解决方案:
将网站中不同的用户群体通过聚类算法计算出来。
400 *10 大类别
10个类别分别计算用户之间的相似度,其实就是计算400个用户之间相似度。 -
问题:
新用户怎么推荐?--------默认推荐
基于用户的协同过滤算法,推荐的商品都是已经被购买过的,对于没有被用户购买过的商品,该如何推荐? ---------混合推荐,将多种推荐模型的结果打乱混合推荐
商品数据和用户数量都很大的情况下,如何处理?------ 按照一定的聚类策略,将用户聚类/物品聚类
基于物品(item)的协同过滤算法
第二代协同过滤技术是基于物品的协同过滤算法,基于物品的协同过滤算法与基于用户的协同过滤算法基本类似。
他使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。
这听起来比较拗口,简单的说就是几件商品同时被人购买了,就可以认为这几件商品是相似的,可能这几件商品的商品名称风马牛不相及,产品属性有天壤之别,但通过模型算出来之后就是认为他们是相似的。什么?你觉得不可思议,无法理解。是的,就是这么神奇!
- 举个例子:
- 物品购买记录
张三购买过,橘子,橙子、苹果、手机、卫生纸
王五购买过,橘子,橙子、苹果、手机、
李四购买过,橘子,橙子、苹果 - 当两个商品同时被购买,就认为相似。
橘子 和 橙子的相似度 3
橘子 和 苹果的相似度3
橘子 和 手机的相似度2
橘子 和 卫生纸的相似度 1 - 怎么推荐?
假设有新用户购买过橘子
那么相关商品有:橙子3、苹果3、手机2、卫生纸1,则会给他推荐这些物品。
其实基于项目的协同过滤推荐机制是 Amazon 在基于用户的机制上改良的一种策略,因为在大部分的 Web 站点中,物品的个数是远远小于用户的数量的,而且物品的个数和相似度相对比较稳定,同时基于项目的机制比基于用户的实时性更好一些。
但也不是所有的场景都 是这样的情况,可以设想一下在一些新闻推荐系统中,也许物品,也就是新闻的个数可能大于用户的个数,而且新闻的更新程度也有很快,所以它的形似度依然不稳 定。所以,其实可以看出,推荐策略的选择其实和具体的应用场景有很大的关系。
混合的推荐机制(重要)
在现行的 Web 站点上的推荐往往都不是单纯只采用了某一种推荐的机制和策略,他们往往是将多个方法混合在一起,从而达到更好的推荐效果。关于如何组合各个推荐机制,这里讲几种比较流行的组合方法。
- 加权的混合(Weighted Hybridization): 用线性公式(linear formula)将几种不同的推荐按照一定权重组合起来,具体权重的值需要在测试数据集上反复实验,从而达到最好的推荐效果。
- 切换的混合(Switching Hybridization):前面也讲到,其实对于不同的情况(数据量,系统运行状况,用户和物品的数目等),推荐策略可能有很大的不同,那么切换的混合方式,就是允许在不同的情况下,选择最为合适的推荐机制计算推荐。
- 分区的混合(Mixed Hybridization):采用多种推荐机制,并将不同的推荐结果分不同的区显示给用户。其实,Amazon,当当网等很多电子商务网站都是采用这样的方式,用户可以得到很全面的推荐,也更容易找到他们想要的东西。
- 分层的混合(Meta-Level Hybridization): 采用多种推荐机制,并将一个推荐机制的结果作为另一个的输入,从而综合各个推荐机制的优缺点,得到更加准确的推荐。
推荐系统的应用场景
Amazon 利用可以记录的所有用户在站点上的行为,根据不同数据的特点对它们进行处理,并分成不同区为用户推送推荐:
- 今日推荐 (Today’s Recommendation For You): 通常是根据用户的近期的历史购买或者查看记录,并结合时下流行的物品给出一个折中的推荐。
- 新产品的推荐 (New For You): 采用了基于内容的推荐机制 (Content-based Recommendation),将一些新到物品推荐给用户。在方法选择上由于新物品没有大量的用户喜好信息,所以基于内容的推荐能很好的解决这个“冷启动”的问题。
- 捆绑销售 (Frequently Bought Together): 采用数据挖掘技术对用户的购买行为进行分析,找到经常被一起或同一个人购买的物品集,进行捆绑销售,这是一种典型的基于项目的协同过滤推荐机制。
- 别人购买 / 浏览的商品 (Customers Who Bought/See This Item Also Bought/See): 这也是一个典型的基于项目的协同过滤推荐的应用,通过社会化机制用户能更快更方便的找到自己感兴趣的物品。
推荐系统架构
京东推荐系统架构
淘宝推荐系统架构
协同过滤的实现
收集用户偏好及标准化处理
要从用户的行为和偏好中发现规律,并基于此给予推荐,如何收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多方式向系统提供自己的偏好信息,而且不同的应用也可能大不相同,下面举例进行介绍:
在一般应用中,我们提取的用户行为一般都多于一种,关于如何组合这些不同的用户行为,基本上有以下两种方式:
- 将不同的行为分组:一般可以分为“查看”和“购买”等等,然后基于不同的行为,计算不同的用户 / 物品相似度。比如:“购买了该图书的人还购买了 …”,“查看了图书的人还查看了 …”
- 根据不同行为反映用户喜好的程度将它们进行加权,得到用户对于物品的总体喜好。一般来说,显式的用户反馈比隐式的权值大,但比较稀疏,毕竟进行显示反馈的用户是少数;同时相对于“查看”,“购买”行为反映用户喜好的程度更大,但这也因应用而异。
数据减噪和归一化
收集了用户行为数据,我们还需要对数据进行一定的预处理,其中最核心的工作就是:减噪和归一化。
- 减噪:用户行为数据是用户在使用应用过程中产生的,它可能存在大量的噪音和用户的误操作,我们可以通过经典的数据挖掘算法过滤掉行为数据中的噪音,这样可以是我们的分析更加精确。
- 归一化:如前面讲到的,在计算用户对物品的喜好程度时,可能需要对不同的行为数据进行加权。但可以想象,不同行为的数据取值可能相差很 大,比如,用户的查看数据必然比购买数据大的多,如何将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和得到的总体喜好更加精确,就需要我们 进行归一化处理。最简单的归一化处理,就是将各类数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中。
进行的预处理后,根据不同应用的行为分析方法,可以选择分组或者加权处理,之后我们可以得到一个用户偏好的二维矩阵,一维是用户列表,另一维是物品列表,值是用户对物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮点数值。
相似度
当已经对用户行为进行分析得到用户喜好后,我们可以根据用户喜好计算相似用户和物品,然后基于相似用户或者物品进行推荐,这就是最典型的 CF 的两个分支
- 基于用户的 CF
- 基于物品的 CF。
关于相似度的计算,现有的几种基本方法都是基于向量(Vector)的,其实也就是计算两个向量的距离,距离越近相似度越大。
在推荐的场景中,在用 户 - 物品偏好的二维矩阵中,我们可以将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,或者将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度。
常用的相似度计算方法:
- 欧几里德距离(Euclidean Distance)
- 皮尔逊相关系数(Pearson Correlation Coefficient)
- Tanimoto 系数(Tanimoto Coefficient)
采用的临近原则一般是 - 固定数量的邻居:K-neighborhoods 或者 Fix-size neighborhoods
- 基于相似度门槛的邻居:Threshold-based neighborhoods
计算基于用户的 CF(User CF)
基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量 来计算用户之间的相似度,找到 K 邻居后,根据邻居的
相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。
上图 给出了一个例子,对于用户 A,根据用户的历史偏好,这里只计算得到一个邻居 - 用户 C,然后将用户 C 喜欢的物品 D 推荐给用户 A。
计算基于物品的 CF(Item CF)
基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户s对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。
从计算 的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的 物品,计算得到一个排序的物品列表作为推荐。
下图 给出了一个例子,对于物品 A,根据所有用户的历史偏好,喜欢物品 A 的用户都喜欢物品 C,得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A,那么可以推断出用户 C 可能也喜欢物品 C。