织梦网站内容替换,淮南发布,互联网 创新创业大赛,网站质量度转载自 基于内容的推荐#xff08;Content-based Recommendations#xff09;Collaborative Filtering Recommendations (协同过滤#xff0c;简称CF) 是目前最流行的推荐方法#xff0c;在研究界和工业界得到大量使用。但是#xff0c;工业界真正使用的系统一般都不会只…转载自 基于内容的推荐Content-based RecommendationsCollaborative Filtering Recommendations (协同过滤简称CF) 是目前最流行的推荐方法在研究界和工业界得到大量使用。但是工业界真正使用的系统一般都不会只有CF推荐算法Content-based Recommendations (CB) 基本也会是其中的一部分。CB应该算是最早被使用的推荐方法吧它根据用户过去喜欢的产品本文统称为 item为用户推荐和他过去喜欢的产品相似的产品。例如一个推荐饭店的系统可以依据某个用户之前喜欢很多的烤肉店而为他推荐烤肉店。 CB最早主要是应用在信息检索系统当中所以很多信息检索及信息过滤里的方法都能用于CB中。CB的过程一般包括以下三步
1. Item Representation为每个item抽取出一些特征也就是item的content了来表示此item
2. Profile Learning利用一个用户过去喜欢及不喜欢的item的特征数据来学习出此用户的喜好特征profile
3. Recommendation Generation通过比较上一步得到的用户profile与候选item的特征为此用户推荐一组相关性最大的item。
[3]中对于上面的三个步骤给出一张很细致的流程图第一步对应着Content Analyzer第二步对应着Profile Learner第三步对应着Filtering Component举个例子说明前面的三个步骤。对于个性化阅读来说一个item就是一篇文章。根据上面的第一步我们首先要从文章内容中抽取出代表它们的属性。常用的方法就是利用出现在一篇文章中词来代表这篇文章而每个词对应的权重往往使用信息检索中的tf-idf来计算。比如对于本文来说词“CB”、“推荐”和“喜好”的权重会比较大而“烤肉”这个词的权重会比较低。利用这种方法一篇抽象的文章就可以使用具体的一个向量来表示了。第二步就是根据用户过去喜欢什么文章来产生刻画此用户喜好的 profile了最简单的方法可以把用户所有喜欢的文章对应的向量的平均值作为此用户的profile。比如某个用户经常关注与推荐系统有关的文章那么他的profile中“CB”、“CF”和“推荐”对应的权重值就会较高。在获得了一个用户的profile后CB就可以利用所有item与此用户profile的相关度对他进行推荐文章了。一个常用的相关度计算方法是cosine。最终把候选item里与此用户最相关cosine值最大的N个item作为推荐返回给此用户。接下来我们详细介绍下上面的三个步骤。
一. Item Representation真实应用中的item往往都会有一些可以描述它的属性。这些属性通常可以分为两种结构化的structured属性与非结构化的unstructured属性。所谓结构化的属性就是这个属性的意义比较明确其取值限定在某个范围而非结构化的属性往往其意义不太明确取值也没什么限制不好直接使用。比如在交友网站上item就是人一个item会有结构化属性如身高、学历、籍贯等也会有非结构化属性如item自己写的交友宣言博客内容等等。对于结构化数据我们自然可以拿来就用但对于非结构化数据如文章我们往往要先把它转化为结构化数据后才能在模型里加以使用。真实场景中碰到最多的非结构化数据可能就是文章了如个性化阅读中。下面我们就详细介绍下如何把非结构化的一篇文章结构化。如何代表一篇文章在信息检索中已经被研究了很多年了下面介绍的表示技术其来源也是信息检索其名称为向量空间模型Vector Space Model简称VSM。记我们要表示的所有文章集合为 而所有文章中出现的词对于中文文章首先得对所有文章进行分词的集合也称为词典为。也就是说我们有N篇要处理的文章而这些文章里包含了n个不同的词。我们最终要使用一个向量来表示一篇文章比如第j篇文章被表示为其中表示第1个词在文章j中的权重值越大表示越重要中其他向量的解释类似。所以为了表示第j篇文章现在关键的就是如何计算各分量的值了。例如我们可以选取为1如果词出现在第 j 篇文章中选取为0如果未出现在第j篇文章中。我们也可以选取为词出现在第 j 篇文章中的次数frequency。但是用的最多的计算方法还是信息检索中常用的词频-逆文档频率term frequency–inverse document frequency简称tf-idf。第j篇文章中与词典里第k个词对应的tf-idf为其中是第k个词在文章j中出现的次数而是所有文章中包括第k个词的文章数量。最终第k个词在文章j中的权重由下面的公式获得做归一化的好处是不同文章之间的表示向量被归一到一个量级上便于下面步骤的操作。 二. Profile Learning假设用户u已经对一些item给出了他的喜好判断喜欢其中的一部分item不喜欢其中的另一部分。那么这一步要做的就是通过用户u过去的这些喜好判断为他产生一个模型。有了这个模型我们就可以根据此模型来判断用户u是否会喜欢一个新的item。所以我们要解决的是一个典型的有监督分类问题理论上机器学习里的分类算法都可以照搬进这里。下面我们简单介绍下CB里常用的一些学习算法
1. 最近邻方法k-Nearest Neighbor简称kNN对于一个新的item最近邻方法首先找用户u已经评判过并与此新item最相似的k个item然后依据用户u对这k个item的喜好程度来判断其对此新item的喜好程度。这种做法和CF中的item-based kNN很相似差别在于这里的item相似度是根据item的属性向量计算得到而CF中是根据所有用户对item的评分计算得到。对于这个方法比较关键的可能就是如何通过item的属性向量计算item之间的两两相似度。[2]中建议对于结构化数据相似度计算使用欧几里得距离而如果使用向量空间模型VSM来表示item的话则相似度计算可以使用cosine。
2. Rocchio算法Rocchio算法是信息检索中处理相关反馈Relevance Feedback的一个著名算法。比如你在搜索引擎里搜“苹果”当你最开始搜这个词时搜索引擎不知道你到底是要能吃的水果还是要不能吃的苹果所以它往往会尽量呈现给你各种结果。当你看到这些结果后你会点一些你觉得相关的结果这就是所谓的相关反馈了。然后如果你翻页查看第二页的结果时搜索引擎可以通过你刚才给的相关反馈修改你的查询向量取值重新计算网页得分把跟你刚才点击的结果相似的结果排前面。比如你最开始搜索“苹果”时对应的查询向量是{“苹果” : 1}。而当你点击了一些与Mac、iPhone相关的结果后搜索引擎会把你的查询向量修改为{“苹果” : 1, “Mac” : 0.8, “iPhone” : 0.7}通过这个新的查询向量搜索引擎就能比较明确地知道你要找的是不能吃的苹果了。Rocchio算法的作用就是用来修改你的查询向量的{“苹果” : 1} -- {“苹果” : 1, “Mac” : 0.8, “iPhone” : 0.7}。在CB里我们可以类似地使用Rocchio算法来获得用户u的profile其中表示item j的属性与分别表示已知的用户u喜欢与不喜欢的item集合而与为正负反馈的权重它们的值由系统给定。在获得后对于某个给定的item j我们可以使用与的相似度来代表用户u对j的喜好度。Rocchio算法的一个好处是可以根据用户的反馈实时更新其更新代价很小。正如在本节开头所说本节要解决的是一个典型的有监督分类问题。所以各种有效的分类机器学习算法都可以用到这里下面列举几个常用的分类算法
3. 决策树算法Decision Tree简称DT当item的属性较少而且是结构化属性时决策树一般会是个好的选择。这种情况下决策树可以产生简单直观、容易让人理解的结果。而且我们可以把决策树的决策过程展示给用户u告诉他为什么这些item会被推荐。但是如果item的属性较多且都来源于非结构化数据如item是文章那么决策树的效果可能并不会很好。
4. 线性分类算法Linear Classifer简称LC对于我们这里的二类问题线性分类器LC尝试在高维空间找一个平面使得这个平面尽量分开两类点。也就是说一类点尽可能在平面的某一边而另一类点尽可能在平面的另一边。仍以学习用户u的分类模型为例。表示item j的属性向量那么LC尝试在空间中找平面使得此平面尽量分开用户u喜欢与不喜欢的item。其中的就是我们要学习的参数了。最常用的学习的方法就是梯度下降法了其更新过程如下其中的上角标t表示第t次迭代表示用户u对item j的打分例如喜欢则值为1不喜欢则值为-1。为学习率它控制每步迭代变化多大由系统给定。和Rocchio算法一样上面更新公式的好处就是它可以以很小的代价进行实时更新实时调整用户u对应的。说到这里很多童鞋可能会想起一些著名的线性分类器Logistic Regression和Linear SVM等等它们当然能胜任我们这里的分类任务。[2]中提到Linear SVM用在文本分类上能获得相当不错的效果:)。如果item属性的每个分量都是0/1取值的话如item为文章的第k个分量为1表示词典中第k个词在item j中为0表示第k个词不在item j中那么还有一种很有意思的启发式更新的算法Winnow算法。[4]中就是使用Winnow算法来获得user profile的。
5. 朴素贝叶斯算法Naive Bayes简称NBNB算法就像它的简称一样牛逼NB经常被用来做文本分类它假设在给定一篇文章的类别后其中各个词出现的概率相互独立。它的假设虽然很不靠谱但是它的结果往往惊人地好。再加上NB的代码实现比较简单所以它往往是很多分类问题里最先被尝试的算法。我们现在的profile learning问题中包括两个类别用户u喜欢的item以及他不喜欢的item。在给定一个item的类别后其各个属性的取值概率互相独立。我们可以利用用户u的历史喜好数据训练NB之后再用训练好的NB对给定的item做分类。NB的介绍很多这里就不再啰嗦了有不清楚的童鞋可以参考NB Wiki或者[1-3]。三. Recommendation Generation如果上一步Profile Learning中使用的是分类模型如DT、LC和NB那么我们只要把模型预测的用户最可能感兴趣的n个item作为推荐返回给用户即可。而如果Profile Learning中使用的直接学习用户属性的方法如Rocchio算法那么我们只要把与用户属性最相关的n个item作为推荐返回给用户即可。其中的用户属性与item属性的相关性可以使用如cosine等相似度度量获得。下面说说CB的优缺点。
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也有。CB应该算是第一代的个性化应用中最流行的推荐算法了。但由于它本身具有某些很难解决的缺点如上面介绍的第1点再加上在大多数情况下其精度都不是最好的目前大部分的推荐系统都是以其他算法为主如CF而辅以CB以解决主算法在某些情况下的不精确性如解决新item问题。但CB的作用是不可否认的只要具体应用中有可用的属性那么基本都能在系统里看到CB的影子。组合CB和其他推荐算法的方法很多我很久以后会写一篇博文详细介绍之最常用的可能是用CB来过滤其他算法的候选集把一些不太合适的候选比如不要给小孩推荐偏成人的书籍去掉。[References]
[1] Gediminas Adomavicius and Alexander Tuzhilin, Towards the Next Generation of Recommender Systems: A Survey of the State-of-the-Art and Possible Extensions
[2] Michael J. Pazzani and Daniel Billsus, Content-Based Recommendation Systems, 2007
[3] Pasquale Lops, Marco de Gemmis and Giovanni Semeraro, Chapter 3 in Recommender Systems Handbook, 2011
[4] Michael J. Pazzani, A Framework for Collaborative, Content-Based and Demographic Filtering, 1999