推荐算法1-content based recommendation

由于本人从来没有真正意义接触过推荐算法,但是找工作时时不时被问到,所以为了避免完全答不出来的尴尬,就临时抱佛教,不求深究,只当了解。所以如果你是查找资料不小心点进来,估计你要失望了,不过文章应该都很短,所以可以随意浏览一下,于你就当温习之用,与我就当笔记之效。

推荐算法,先按照大的思想分为两类:content based recommendation,基于内容的推荐算法,简称CB算法;Collaborative Filtering Recommendations,协同过滤算法,简称CF算法是如今比较流行的算法;

CB算法的主要步骤:

  1. Item representation
  2. Profile learning
  3. Recommendation

1.Item representation
也就是为每个item抽取特征,从而表示为特征向量。

比如,如果item是文本,而对文本进行特征抽取是一项比较经典的问题。

  1. 先对文本进行分词,简单而言就是将一段话分割成词的组合。比较有代表性的分词方法比如:最大匹配法、最大概率法分词、最短路径分词方法;
  2. 然后对分词结果进行特征映射,大体可以分为三类:布尔模型、向量空间模型、概率模型;

布尔模型:就是直接统计每个词在该文档中是否出现,出现就为1,不出现就为0;
向量空间模型(VSM):向量空间模型中将文档表达为一个矢量,看作向量空间中的一个点;一般涉及两个概念,词频(term frequency)和逆文档概率(document frequency),词频就是指一个词出现的次数,出现次数越多说明对其属性标注越有意义;逆文档概率,代表包含该词的文档比率越高,说明该文档的属性标注的意义就不大。
概率模型:没时间了解,pass,以后再补充吧。

2.Profile learning
这部分就比较熟悉了,既然我们已经为每个item进行了特征表示,接下来的任务就是建立分类模型。简单而言,就是我们已经存在一些用户的历史信息,比如 {(item1,)(item2,)...} ,这就是一个典型的分类训练问题了。机器学习中的分类方法:支持向量机SVM,决策树DT,K-近邻KNN,朴素贝叶斯NB,Adaboost等等都可以用来对用户的喜好进行建模。

有人提到了Rocchio算法,是文本搜索比较经典易用的方法。该算法要找一个最优查询向量q ,它与相关文档之间的相似度最大且同时又和不相关文档之间的相似度最小,这个相似度是用下式来衡量的:
《推荐算法1-content based recommendation》
至于怎么寻找了,是基于下式:
《推荐算法1-content based recommendation》
上面两式有点类似迭代优化求解的味道,第一个式子是目标函数。但是我们是不知道具体哪些是属于相关文档 Cr 和不相关文档 Cnr 。那怎么做了?我们可以假定我们有一些初始的相关文档和不相关文档,然后用户可以对这些文档进行判断,然后更新相关文档和不相关文档集合,同时更新查询向量。
举例:我们利用搜索引擎进行查询时,如果我们的输入是模糊有歧义的,那么搜索第一页的结果必然是不令人满意的。但是根据用户在第一页的点击情况,我们可以反馈更新我们的相关文档和不相关文档,那么第二页的结果便可以进行优化。

3.Recommendation

推荐无非是利用之前获取的item的特征向量以及用户的喜好profile,进行预测分类的问题。所以主要存在的问题就是相似度衡量。

  1. 欧式距离
  2. 向量内积
  3. 向量夹角余弦
  4. Jaccard相似度

CB的优点:

  1. 用户之间的独立性(User Independence):既然每个用户的profile都是依据他本身对item的喜好获得的,自然就与他人的行为无关。而CF刚好相反,CF需要利用很多其他人的数据。CB的这种用户独立性带来的一个显著好处是别人不管对item如何作弊(比如利用多个账号把某个产品的排名刷上去)都不会影响到自己。

  2. 好的可解释性(Transparency):如果需要向用户解释为什么推荐了这些产品给他,你只要告诉他这些产品有某某属性,这些属性跟你的品味很匹配等等。

  3. 新的item可以立刻得到推荐(New Item Problem):只要一个新item加进item库,它就马上可以被推荐,被推荐的机会和老的item是一致的。而CF对于新item就很无奈,只有当此新item被某些用户喜欢过(或打过分),它才可能被推荐给其他用户。所以,如果一个纯CF的推荐系统,新加进来的item就永远不会被推荐。

CB的缺点:

  1. item的特征抽取一般很难(Limited Content Analysis):如果系统中的item是文档(如个性化阅读中),那么我们现在可以比较容易地使用信息检索里的方法来“比较精确地”抽取出item的特征。但很多情况下我们很难从item中抽取出准确刻画item的特征,比如电影推荐中item是电影,社会化网络推荐中item是人,这些item属性都不好抽。其实,几乎在所有实际情况中我们抽取的item特征都仅能代表item的一些方面,不可能代表item的所有方面。这样带来的一个问题就是可能从两个item抽取出来的特征完全相同,这种情况下CB就完全无法区分这两个item了。比如如果只能从电影里抽取出演员、导演,那么两部有相同演员和导演的电影对于CB来说就完全不可区分了。

  2. 无法挖掘出用户的潜在兴趣(Over-specialization):既然CB的推荐只依赖于用户过去对某些item的喜好,它产生的推荐也都会和用户过去喜欢的item相似。如果一个人以前只看与推荐有关的文章,那CB只会给他推荐更多与推荐相关的文章,它不会知道用户可能还喜欢数码。

  3. 无法为新用户产生推荐(New User Problem):新用户没有喜好历史,自然无法获得他的profile,所以也就无法为他产生推荐了。当然,这个问题CF也有。

    原文作者:小羊哈利
    原文地址: https://blog.csdn.net/u013207865/article/details/52373105
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞