推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,因此大量的用户行为数据就称为推荐系统的重要组成部分和先决条件。很多在开始阶段就希望有个性化推荐应用的网站来说,如何在没有大量用户数据的情况下设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统,就是冷启动问题。
冷启动问题主要分为3类:
对于这3种不同的冷启动问题,有不同的解决方法。一般来说,可以参考如下解决方案。
在网站中,当新用户刚注册时,不知道他喜欢什么物品,于是只能给他推荐一些热门的商品。但如果我们知道她是一位女性,那么可以给她推荐女性都喜欢的热门商品。这也是一种个性化的推荐。当然这个个性化的粒度很粗,因为所有刚注册的女性看到的都是同样的结果,但相对于不区分男女的方式,这种推荐的精度已经大大提高了。因此,利用用户的注册信息可以很好地解决注册用户的冷启动问题。在绝大多数网站中,年龄、性别一般都是注册用户的必备信息。
用户的注册信息分3种。
人口统计学特征包括年龄、性别、工作、学历、居住地、国籍、民族等,这些特征对预测用户的兴趣有很重要的作用,比如男性和女性的兴趣不同,不同年龄的人性却也不同。 基于人口统计学特征的推荐系统其典型代表是Bruce Krulwich开发的Lifestyle Finder.首先Bruce将美国人群根据人口统计学属性分成62类,然后对比每个新用户根据其填写个个人资料判断他属于什么分类,最后给他推荐这类用户最喜欢的15个链接,其中5个链接是推荐他购买的商品,5个链接是推荐他旅游的地点,剩下的5个链接是推荐他去逛的商店。
为了证明利用用户人口统计学特征后的推荐结果好于随机推荐的结果, Krulwich做了一个AB测试。相对于利用人口统计学特征的算法,Krulwich设计了一个对照组,该组用户看到的推荐结果是完全随机的。实验结果显示,对于利用人口统计学特征的个性化推荐算法,其用户点击率为89%,而随机算法的点击率只有27%。对于利用人口统计学特征的个性化算法,44%的用户觉得推荐结果是他们喜欢的,而对于随机算法只有31%的用户觉得推荐结果是自己喜欢的。因此,我们得到一个结论——使用人口统计学信息相对于随机推荐能够获得更好的推荐效果。当然,Krulwich的实验也有明显的缺点,即他没有对比和给用户推荐最热门的物品的推荐算法。因为热门排行榜作为一种非个性化推荐算法,一般也比随机推荐具有更高的点击率。
基于注册信息的个性化推荐流程基本如下:
基于用户注册信息的推荐算法其核心问题是计算每种特征的用户喜欢的物品。也就是说,对于每种特征f,计算具有这种特征的用户对哥哥物品的喜好程度p(f,i).
p(f,i)可以简单地定义为物品i在具有f的特征的用户中的热门程度: \(p(f,i) = |N(i) \cap U(f)|\)
其中,N(i)是喜欢物品i的用户集合,U(f)是具有特征f的用户集合。
根据这种定义可以比较准确地预测具有某种特征的用户是否喜欢某个物品。但是,在这种定义下,往往热门的物品会在各种特征用户中都具有比较高的权重。也就是说具有比较高的|N(i)|的物品会在每一类用户中都有比较高的p(f,i)。对公式进行修正,将p(f,i)定义为喜欢物品i的用户中具有特征f的比例:
\(p(f,i) = \frac{|N(i) \cap U(f)|}{|N(i)| + \alpha}\)
这里分母中参数alpha用来解决数据稀疏问题。比如,有一个物品只被1个用户喜欢过,而这个用户刚好具有特征f,那么就有p(f,i)=1.但是,这种情况并没有统计意义,因此为分母加上一个比较大的数,可以避免这样的物品产生比较大的权重。
解决用户冷启动问题的另一个方法是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户提供一些物品,让用户反馈他们对这些物品的兴趣,然后根据用户反馈提供个性化推荐。
对于这些通过让用户对物品进行评分来收集用户兴趣,从而对用户进行冷启动的系统,它们需要解决的首要问题就是如何选择物品让用户进行反馈。
一般来说,能够用来启动用户兴趣的物品需要具有一下特点:
上面这些因素是选择启动物品时需要考虑的,但如何设计一个选择启动物品集合的系统?Nadav Golbandi提出可以使用一个决策树解决这个问题。
物品冷启动需要解决的问题是如何将新加入的物品推荐给对它感兴趣的用户。物品冷启动在新闻网站等时效性很强的网站中非常重要。
UserCF算法对物品冷启动问题并不非常敏感。因为,USerCF在给用户进行推荐时,会首先找到和用户兴趣相似的一群用户,然后给用户推荐这一群用户喜欢的物品。在很多网站中,推荐列表并不是给用户展示内容的唯一列表,当一个用户对某个物品产生反馈后,和他历史兴趣相似的其他用户的推荐列表中就有可能出现这一物品,从而更多的人就会对这个物品产生反馈,导致更多的人的推荐列表中就会出现这一物品,因此该物品就能不断地扩散开来,从而逐步展示到对它感兴趣用户的推荐列表中。
但是,有些网站中推荐列表可能是用户获取信息的主要途径,比如豆瓣网络电台。那么对于UserCF算法就需要解决第一推动力的问题, 即第一个用户从哪儿发现新的物品。只要有一小部分人能够发现并喜欢新的物品,UserCF算法就能将这些物品扩散到更多的用户中。解决第一推动力最简单的方法是将新的物品随机展示给用户,但这样不太个性化,因此可以考虑利用物品的内容信息,将新物品先投放给曾经喜欢过和它内容相似的其他物品的用户。
对于ItemCF算法来说,物品冷启动是一个严重的问题。因为ItemCF算法的原理是给用户推荐和他之前喜欢的物品相似的物品。ItemCF算法会每隔一段时间利用用户行为计算物品相似度表(一般一天计算一次),在线服务时ItemCF算法会将之前计算好的物品相关度矩阵放在内存中。因此,当新物品加入时,内存中的物品相关表中不会存在这个物品,从而ItemCF算法无法推荐新的物品。解决这一问题的办法是频繁更新物品相似度表,但基于用户行为九三物品相似度是非常耗时的,主要原因是用户行为日志非常庞大。而且,新物品如果不展示给用户,用户就无法对产生行为,通过行为日志计算是计算不出包含新物品的相关矩阵的。为此,只能利用物品的内容信息计算物品相关表,并且频繁地更新相关表(比如半小时计算一次)。
物品的内容可以用向量空间模型表示,该模型会将物品表示成一个关键词向量。对于文本,该模型通过分词、实体检测、关键词排名等步骤将文本表示成一个关键词向量 {(e1,w1),(e2,w2),...} 。其中,ei是关键词,wi是关键词对应的权重。次的权重可以用TF-IDF计算权重:
\(w_i = \frac{TF(e_i)}{logDF(e_i)}\)
向量空间模型的优点是简单,缺点是丢失了一些信息,比如关键词之间的关系信息。不过在绝倒数应用中,向量空间模型对于文本的分类、聚类、相似度计算已经可以给出令人满意的结果。
在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间余弦相似度计算:
\(w_{ij} = \frac{d_i*d_j}{\sqrt{||d_i||*||d_j||}}\)
代码:
function CalculateSimilarity(D)#D文档集合
for di in D:
for dj in D:
w[i][j] = CosineSimilarity(di, dj)
return w
向量空间模型的一个问题是不能理解含义近似的关键词,因此在内容较少时准确度很差。话题模型通过首先计算文本的话题分布,然后再计算相似度来解决这个问题,如LDA模型。
任何模型都有一个假设, LDA 作为一种生成模型,对一篇文档产生的过程进行了建模。话题模型的基本思想是,一个人在写一篇文档的时候,会首先想这篇文章要讨论哪些话题,然后 思考这些话题应该用什么词描述,从而最终用词写成一篇文章。因此,文章和词之间是通过话 题联系的.
LDA包含文档、话题、词3种元素,每个词属于一个话题,通过迭代收敛得到话题的分布,文档的相似度由话题分布的相似度来度量. 每一篇文档都会表现为词的集合。这称为词袋模型(bag of words).每个词在一篇文档中属于一个话题。令D为文档集合,D[i]是第i篇文档,w[i][j]是第i篇文档的第j个词,z[i][j]是第i篇文档的第j个词属于的话题。
LDA的计算过程包括初始化和迭代两部分。首先要对z进行初始化,而初始化的方法很多简单,假设一共有K个话题,那么对第i篇文章中的第j个词,可以随机给它赋予一个话题。在初始化之后,通过迭代使话题的分布收敛到一个合理的分布上去。
在使用 LDA 计算物品的内容相似度时,我们可以先计算出物品在话题上的分布,然后利用两个物品的话题分布计算物品的相似度。比如,如果两个物品的话题分布相似,则认为两个物品具有较高的相似度,反之则认为两个物品的相似度较低。计算分布的相似度可以利用 KL 散度:
其中p和q是两个分布,KL散度越大说明分布的相似度越低。
很多推荐系统在建立时,既没有用户的行为数据,也没有充足的物品内容信息来计算准确的物品相似度。为了在推荐系统建立时就让用户得到比较好的体验,很多系统都利用专家进行标注。