一、常见的推荐算法原理(时间、位置影响)
目前常见的一些推荐如下:
- 基于内容推荐:分析用户看过的内容(历史内容等 )再进行推荐。
- 基于用户的协同过滤推荐(UserCF):给用户推荐和他兴趣相似的其它用户喜欢的物品。
- 基于物品的协同过滤推荐(ItemCF):给用户推荐和他之前喜欢的物品相似的物品。
- 基于标签的推荐:内容有标签,用户也会因为用户行为被打上标签,通过给用户打标签或是用户给产品打标签为其推荐物品。
- 隐语义模型推荐(LFM):通过隐含特征推荐和用户兴趣匹配的物品。
- 社会化推荐:让好友给自己推荐物品。
- 根据时间上下文推荐:利用用户访问产品的时间优化推荐算法,或是根据季节性时令性变化进行推荐。(如春节推荐春节相关物品)
- 基于地理位置的推荐(LARS):根据用户的地理位置进行推荐。
其中比较常见的就是前4种推荐,7、8实际上是在基本的推荐算法上加上了一层根据时间和位置的加权筛选。
各种推荐算法是可以叠加在一起的,根据不同算法的权重调整,给用户最为精准智能的推荐。
(一)、基于内容的推荐
基于内容的推荐是基础的推荐策略。如果你浏览或购买过某种类型的内容,则给你推荐这种类型下的其他内容。
基于内容的推荐好处在于易于理解,但不足在于推荐不够智能,多样性和新颖性不足。
比如下图中用户某一天想买的是单反,但购买单反不是一个频繁的行为,且买的是高端单反,那么接下来给用户推荐的全是高端单反,推荐的转化率就会低很多。
又或者是根据浏览历史推荐,但假如我已经买过了该物品,再给我推荐,重复购买的可能性会低很多。
(二)、基于用户的协同过滤算法:
基于用户的协同过滤(UserCF)算法,通过用户对不同内容的行为,来评测用户之间的相似性,基于用户之间的相似性做出推荐。这部分推荐本质上是给用户推荐和他相似的人感兴趣的东西。
比如你曾经喜欢(多次观看)的电影都是科幻类的电影,如异形,终结者、星球大战等,通过数据分析我找到了和你一样看过异形,终结者,星球大战的人,我发现他还经常看复仇者联盟的电
影,那么我则可以推荐你很有可能也会喜欢看复仇者联盟,那么我就可以向你推荐复仇者联盟。
以下对UserCF进行比较详细的说明,其余的算法会类似:
- 用 N(u)表示用户u曾经有过正反馈的物品集合
- 用N(v)表示用户v曾经有过正反馈的物品集合
用jaccard公式表示u和v的兴趣相似度:
W(uv)=|N(u)∩N(v)|/|N(u)∪N(v)| 或者 用余弦相似度 W(uv)=|N(u)∩N(v)|/√|N(u)||N(v)|
对应的表如下,该表的意思是用户A对物品{a,b,c}有有过行为,对{a,b,c}是感兴趣的,用户B对{a,c}是感兴趣的
那么用余弦公式计算用户A和用户B的兴趣相似度就是W(ab)=|{a,b,c}∩{a,c}|/√|{a,b,c}||{a,c}|=1/√6
实际上的话,很多用户之间并没有对同样的物品产生行为,即|N(u)∩N(v)|=0,为了优化这种情况,我们可以先计算出|N(u)∩N(v)|≠0的用户(u,v)再除以分母√|N(u)||N(v)|
首先需要建立物品到用户的倒排表,对于每个物品都保存该物品产生过行为的用户列表,令稀疏矩阵C[u][v]=|N(u)∩N(v)|,假设用户u和用户v同时属于倒排表K个物品对应的用户列表
即C[u][v]=K,接着扫描倒排表中每个物品对应的用户列表,将用户列表中两两用户对应的C[u][v]加1,最终就可以得到所有用户之间不为0的C[u][v]
如图,建立了一个4X4的用户相似度矩阵,对于物品a,将W[A][B]和W[B][A]加1,对于物品b,将W[A][C]和W[C][A]加1,扫描完所有物品后,可以得到最终的W矩阵,这里的W就是余弦
相似度公式的分子,再除以分母√|N(u)||N(v)| 就可以得到最终的用户兴趣相似度。
得到了用户兴趣相似度后,根据UserCF算法给用户推荐和他兴趣最相似的K个用户喜欢的物品,以下的公式计算了UserCF中用户u对物品i的感兴趣程度,公式如下:
- S(u,k):用户u兴趣最接近的K个用户
- N(i):对物品i有行为的用户集合
- W(uv):用户u和用户v的兴趣相似度
- rvi:用户v对物品i的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的rvi=1
以上的算法公式还比较粗糙,如果两个人购买了同一个物品,不能说明他们的兴趣一定相同,因此可以对算法进行改进,提高算法的性能。
新的公式会通过降权惩罚用户u和用户v共同兴趣列表中热门物品对他们相似度对影响。
不同的算法有各自不同的效果,也会有不同的限制和缺点,在使用中也要结合产品的用户不停调整优化,达到最好的效果。
UserCF的限制和缺点:用户数越来越大的话,计算用户之间的相似度矩阵,系统运行的时间,复杂度,整体的成本都会大幅度增加。
(三)、基于物品的协同过滤算法
基于物品的协同过滤(ItemCF)算法,通过分析用户的行为记录计算物品之间的相似度,比如物品A和物品B具有很大的相似度是因为喜欢A的用户大都也喜欢物品B。
比如下图中,我曾经搜索过桌面摆件招财猫,然后系统推荐给我了同样是桌面摆件的摩托车模型。
- 计算物品之间的相似度
- 根据物品之间的相似度和用户的历史行为给用户生成推荐列表
W(i,j)=|N(i)∩N(j)|/√|N(i)||N(j)|
N(i)和N(j)表示喜欢物品i的用户数,ItemCF的算法结构基本与UserCF的算法类似,这里不做过多说明了。
算法并不万能,需要不断调整和优化,或是根据形态简化算法。
- UserCF的推荐更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,更快。
- ItemCF的推荐更加个性化,反映了用户自己兴趣,用户兴趣需要稳定持久。
UserCF
- 性能:适用于用户较少的场合,用户多则计算相似矩阵代价大
- 领域:实效性强,用户个性化兴趣不太明显的领域
- 实时性:用户有新行为,不一定造成推荐结果的立即变化
- 冷启动:新用户对很少的物品产生行为后,不能立即对其进行个性化推荐。新物品上线后,一旦有用户对物品进行了行为,将可以将新物品推荐给和他产生行为的用户兴趣相似的其它用户。
ItemCF
- 性能:适用于物品数明显小于用户数的场合,如果物品较多,矩阵计算代价大
- 领域:长尾物品丰富,用户个性化需求强烈的领域
- 实时性:用户有新行为,一定会导致推荐结果的实时变化
- 冷启动:新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其它物品。不能在不离线更新物品相似度表的情况下将新物品推荐给用户。
两种算法的一些限制:
- 若某个物品太过热门,则所有推荐中都可能出现该物品,需要对热门物品作出惩罚,惩罚公式xxxx
- 不同领域的最热门物品之间往往有比较高的相似度。(仅靠用户数据不能解决这个问题)
(四)、基于标签的推荐
基于标签的推荐一般分为两种,一种是通过给用户的某些特征打上标签,另一种则是让用户自己给物品打上标签,这里主要讲用户给物品打标签(UGC)。
基于UGC的标签推荐主要是利用用户打标签的行为为其推荐物品,在用户给物品打标签时也要提供合适该物品的标签。用户用标签描述对物品的看法,标签是反应用户兴趣的重要数据源。
一个用户行为的数据集一般由一个三元组的集合表示,其中记录{u,i,b}表示用户u给物品i打上了标签b(当然实际中会包含用户属性、物品属性等,更为复杂)。
–(具体的算法这里隐去,了解原理即可)–
给用户提供标签一般有 这么几种方法 :
- 给用户推荐一个系统中最热门的标签
- 给用户推荐物品i上最热门的标签
- 给用户推荐他自己经常使用的标签
- 将方法2和方法3融合,通过一个系数将上面的推荐结果线性加权,生成最终的推荐结果
常见的基于标签(UGC)的推荐有豆瓣:
(五)、隐语义模型LFM
LFM的核心思想:通过隐含特征联系用户兴趣和物品
对于某个用户,首先要得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品,要得到他喜欢的的物品分类需要考虑到3个问题:
1.如何给物品分类?
目前比较简单的做法是通过人工给物品分类,按照不同的物品分类方法。
另外则是通过隐含语义分析技术,采用基于用户行为统计的自动聚类来解决这个问题,比较著名的模型和方法有pLSA,LDA,隐含类别模型,隐含主题模型,矩阵分析等等。
2.如何确定用户对哪些物品感兴趣,以及感兴趣的程度?
推荐系统的用户行为分为隐性反馈和显性反馈,主要讨论隐性反馈数据集 ,这种数据集只有正样本(用户喜欢什么物品),没有负样本(用户对什么物品不感兴趣),在隐性反馈数据集上应用LFM解决推荐的问题需要给每个用户生成负样本,有这么几种方法:
- 对于一个用户,用他没有过行为的物品作为负样本
- 对于一个用户,用他没有过行为的物品中均匀采样出一些物品作为负样本
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,采样时,保证每个用户的正负样本数目相当
- 对于一个用户,从他没有过行为的物品中采样出一些物品作为负样本,采样时,偏重不热门的物品。
采负样本的一些原则:
对于每个用户,采样时要保证正负样本的平衡。
对于每个用户采样负样本时,要选取那些热门,而用户没有行为的物品。
综合以上的方法结合用户行为频率计算确定用户感兴趣的物品和程度。
3.对一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重?
这个问题主要的解决方法就是通过1.2的计算结果综合算法得出,根据算法计算调整不同物品的权重,通过迭代不断优化算法中的参数。
LFM中重要的参数有(仅了解就可以,具体需要结合算法公式):
- 隐特征的个数F
- 算法学习的速率
- 正则化参数
- 负样本/正样本比例
LFM具有学习能力,能实现自我学习不断优化模型。
(六)、社会化推荐
根据某机构的调查,在购买物品时,90%左右的用户会相信朋友的推荐,70%的用户会相信网上其他用户对商品的评论。
在互联网中最明显的社会化推荐则是利用社交网络数据进行推荐,利用社交网络数据推荐一般可以从以下几个方面入手:
- 电子邮箱的社交关系信息
- 用户注册信息
- 用户的位置数据,web的IP和手机的GPS
- 讨论组和论坛
- 聊天工具中的好友关系列表
- 社交网站中的好友关系数据
基于社交信息的社会化推荐能够利用好友的关系,解决一部分冷启动的问题。
情况1.你通过朋友的分享进入的,你朋友在网站中玩的比较久,有推荐数据。由于你之前在该网站没有任何数据,那么我要想给你推荐物品,就可以根据你朋友的推荐列表来给你推荐你可能会喜欢的东西。
情况2.如果你是刚来到一个网站,你没有朋友, 我想给你做社会化推荐的话,可以根据你的注册信息、位置,共同兴趣等给你推荐好友,再给你做好友推荐。
(七)、根据时间上下文推荐
上下文包括用户访问推荐系统的时间、地点、心情等,根据时间上下文的推荐是希望能够准确预测用户在某个特定时刻或某段时刻的兴趣。
比如电商产品在卖衣服时,冬天推荐的衣物和夏天推荐的衣物是不同的。如下图,淘宝网在冬季的推荐:
时间信息对用户兴趣的影响主要表现在以下几个方面:
- 用户的兴趣是变化的
- 物品是有生命周期的
- 季节效应
考虑到时间信息后,推荐系统也从一个静态系统变成了一个时变的系统,而用户行为数据也变成了时间序列。
在给定数据集后,可以通过统计以下信息研究推荐系统的时间特性:
- 数据集每天独立用户数的增长情况(平稳阶段、增长阶段、衰落阶段等)
- 系统的物品变化情况
- 用户访问情况
推荐系统的实时性
用户的兴趣是不断变化的,其变化体现在用户不断增加的新行为中,一个实时的推荐系统需要能够实时响应用户新的行为,让推荐列表不断变化,从而满足用户不断变化的兴趣。
实时的推荐系统应该满足:
- 对用户行为的存取有实时性(在用户访问推荐系统时计算)。
- 对推荐算法本身有实时性(考虑到用户近期行为和长期行为)。
推荐算法的时间多样性:推荐系统每天推荐结果的变化程度,有的推荐系统中用户经常能看到不同的推荐结果。
时间上下文的推荐算法
- 推荐最新最热门的物品
- 时间上下文的ItemCF算法,利用用户行为离线计算物品之间的相似度,根据用户的历史行为和物品相似度矩阵,给用户做在线个性化推荐。
物品的相似度计算:用户在像个很短的时间内喜欢的物品有更高的相似度。
在线推荐:用户近期行为相比用户很久之前的行为,更能体现用户现在的兴趣。
3.时间上文的UserCF算法
用户的兴趣相似度计算:如果两个用户同时喜欢相同的物品,则兴趣相似度越大。
相似兴趣用户的最近行为(推荐与其兴趣相似的用户最近喜欢的物品)。
(八)、基于地理位置的推荐
基于位置的推荐算法(LARS)会根据用户所在的国家、城市、街道探寻规律进行推荐,找到用户地点和兴趣相关的特征,主要包括兴趣本地化和活动本地化。
LARS的基本思想是将数据集根据用户的位置划分成很多子集,位置是一个树状结构,比如国家、省、市、区、县的结构,因此数据集也会划分成一个树状结构。
根据用户的位置,将其分配到一个叶子节点中,而该节点会包括了所有和他同一位置的用户行为数据集。
LARS会利用该叶子节点上的用户行为数据,通过ItemCF或UserCF给用户推荐。
数据集会包括(用户、用户位置、物品、物品位置、物品评分)的记录
比如大众点评的推荐:
二、推荐系统的冷启动问题
推荐系统的冷启动问题指的是,当推荐系统刚部署后,没有用户行为时或物品数据时,推荐系统并不能根据用户行为数据给用户推荐物品。一般分为用户冷启动、物品冷启动和系统冷启动。
通常有一些办法可以缓和冷启动问题
1.利用用户注册信息推荐:即获取用户的注册信息,然后对用户分类,给用户推荐他所属分类中可能感兴趣的物品。 将关联的查询结果按照一个权重相加,利用的用户信息越多,就能越精准
地匹配用户兴趣。
2.给用户一些内容选择合适的物品启动用户的兴趣:选择一些热门的,有代表性、区分性、多样性的物品推荐给用户。
3.利用物品的内容信息推荐给用户:可以通过人工筛选出一些用户会感兴趣的物品推荐。
三、推荐系统的架构
如果一个系统中将各种用户行为、特征和任务都考虑进去,系统会非常复杂,难以配置。因此推荐系统需要由多个推荐引擎组成,每个推荐引擎负责一类特真和一种任务,而推荐系统只是
将推荐引擎的结果按照一定权重或优先级合并、排序,然后返回。
这样的优势在于:每一个引擎代表了一种推荐策率,可通过对单一的引擎调整来优化推荐系统。
如何设计一个推荐引擎成了推荐系统设计的核心部分。
- 模块A:从数据库或缓存中拿到用户行为数据,通过分析不同行为,生成当前用户的特征向量。
- 模块B:将用户的特征向量通过特征-物品相关举证转换为初始推荐物品列表。
- 模块C:对初始的推荐列表进行过滤,排名等处理,生成最终的推荐结果。
生成用户特征向量:用户特征向量一般包括两种:
- 从用户的注册信息提取,包括用户的人口统计学特征等,在推荐时直接拿到用户他恶政数据生成特征向量。
- 从用户行为中计算出来
通过用户行为生成特征(需要考虑以下几点):
- 用户行为的种类(用户会对物品产生很多种不同的行为)。
- 用户行为产生的时间(近期行为比较重要)。
- 用户行为的次数(一般行为次数多的物品权重越高)。
- 物品的热门程度(用户对很热门的物品产生行为可能是在跟风,推荐引擎在生成用户特征时会加重不热门物品对应特征的权重)。
特征-物品相关推荐:
在得到用户的特征向量后,根据离线的相关表得到初始化物品推荐表。
每个特征,在相关表中存储和它最相关的N个物品的ID。
一个推荐引擎可以在配置文件中配置很多相关表以及他们的权重,推荐系统启动后会将相关表按配置的权重相加,最终的相关表保存在内存中,给用户推荐时,已经是加权后的相关表了。
候选物品结合(保证推荐结果只包含候选物品集合中的物品):
一般应用于产品需求,希望将某些物品推荐给用户。
过滤模块:
过滤掉不符合要求的物品,一般有以下几种
- 用户已经产生过行为的物品(推荐的目的是帮助用户发现物品,因此没必要给用户推荐他已经知道过的物品,保证推荐结果的新颖性)。
- 候选物品以外的物品,用户自己的选择等。
- 质量差、评价低的物品。
排名模块:
- 新颖性排名(对某些旧的但仍然热门的物品降权处理)。
- 多样性
- 按照某物品内容属性分为几类,然后在每个类中都选择该类中排名最高的物品组合最终的推荐列表
- 控制不同的推荐结果的推荐理由出现的次数,推荐理由一般是产生推荐结果的重要特征,提高多样性需要让推荐结果尽量来自不同的特征,有不同的推荐理由。
3.时间多样性
- 实时推荐
- 记录用户之前的行为数据,在给用户新的推荐结果是降权
4.用户反馈(用户对推荐结果点击情况的反馈)。
四、推荐系统的度量
个性化推荐的核心还是推荐算法,依赖用户的行为数据,却决于定义的环境维度,不同维度下的算法的表现能力会不一样。
什么是好的推荐系统:
- 满足用户的需求,推荐给用户的是用户会感兴趣的内容。
- 满足所有的内容都被推荐给感兴趣的用户(衡量的指标为覆盖率)。
- 推荐系统本身搜集到高质量的用户反馈,能够对之进行不断的完善。
好的推荐系统不仅能预测用户的行为,能扩展用户的视野,帮助用户发现那些他们可能会买,但却不那么容易发现的东西,而非是本来就想要买的东西。
推荐系统的评价指标:
- 用户满意度
- 预测精准度
- 覆盖率
- 多样性
- 新颖性(不牺牲精度的情况下提高多样性,即新东西)
- 惊喜度(推荐结果和用户历史兴趣不相似,但却让用户满意)
- 信任度
- 实时性
- 健壮性(反作弊处理逻辑)
- 商业目标
推荐算法的考核指标:
- 准确率
- 召回率
- 流行度
- 覆盖率
推荐系统的测试方法:
- 离线测试:通过用户行为数据形成数据集
- 用户调查
- 在线实验:A/B测试(切分流量,将用户分成不同的层控制观察)