推荐算法

2017-12-04 15:20:07

所谓推荐算法就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西。

推荐算法主要有两种:

  • 基于内容:
原理是用户喜欢和自己关注过的Item在内容上类似的Item,比如你看了哈利波特I,基于内容的推荐算法发现哈利波特II-VI,与你以前观看的在内容上面(共有很多关键词)有很大关联性,就把后者推荐给你,这种方法可以避免Item的冷启动问题(冷启动:如果一个Item从没有被关注过,其他推荐算法则很少会去推荐,但是基于内容的推荐算法可以分析Item之间的关系,实现推荐),弊端在于推荐的Item可能会重复,典型的就是新闻推荐,如果你看了一则关于MH370的新闻,很可能推荐的新闻和你浏览过的,内容一致;另外一个弊端则是对于一些多媒体的推荐(比如音乐、电影、图片等)由于很难提内容特征,则很难进行推荐,一种解决方式则是人工给这些Item打标签。
  • 协同过滤:
原理是用户喜欢那些具有相似兴趣的用户喜欢过的商品,比如你的朋友喜欢电影哈利波特I,那么就会推荐给你,这是最简单的基于用户的协同过滤算法(user-based collaboratIve filtering),还有一种是基于Item的协同过滤算法(item-based collaborative filtering),这两种方法都是将用户的所有数据读入到内存中进行运算的,因此成为Memory-based Collaborative Filtering,另一种则是Model-based collaborative filtering,包括Aspect Model,pLSA,LDA,聚类,SVD,Matrix Factorization等,这种方法训练过程比较长,但是训练完成后,推荐过程比较快。
 
一、隐含语义分析
TF:Term Frequency,也就是单词出现的频率

idf:Inverse Document Frequency,也就是单词在所有文档中的出现频率的倒数的log。

TF-idf

所以我们认为一个单词为一篇文档的频繁词要满足两个条件,一是该搜索词在该片中反复出现,二是在其他文档中出现的比较少。

对于一句话那就是多个tf-idf值的加和。

向量空间模型:

计算机是无法识别一个文档的,但是我们可以给出一组关键词,用这组关键词来表示这个文档。

 

这里的W值可以是0,1表示该关键词有没有出现,也可以是计数值,也可以上TF-idf值。

有了向量空间模型之后,我们可以通过向量求余弦值来对两篇文章的关联度进行分析:

Cosine Similarity:

显然,cosine值为1则最为相关,如果为0则最不相关。那么就可以通过这种方法来进行文本聚类,或者进行语句与文本的关联度分析。

这种方法有两个问题:

  • 同一含义多种单词,比如搜car,其实vehicle,Automobile等都是表示同样的含义,但是在使用余弦的时候会返回一个很小的值,表示不太相关。
  • 同一单词多种含义,比如Apple,可能是指苹果公司,可能是指食物苹果,这样就会导致结果的精准度很差。

 解决方法其中之一就是使用奇异值分解的隐含语义分析算法。

隐含语义分析 Latent semantic analysis:

传统向量空间模型使用精确的词匹配,即精确匹配用户输入的词与向量空间中存在的词。由于一词多义(polysemy)和一义多词(synonymy)的存在,使得该模型无法提供给用户语义层面的检索。比如用户搜索”automobile”,即汽车,传统向量空间模型仅仅会返回包含”automobile”单词的页面,而实际上包含”car”单词的页面也可能是用户所需要的。

此时,就可以使用隐含语义分析技术将原单词中的隐含信息提取出来。具体来说采用的技术是奇异值分解技术SVD(singular value decomposition)

多篇文章的向量空间模型可以组成一个矩阵,不妨用X来表示:

对X的矩阵进行SVD变换:

如图所示,可以将X分解为三个矩阵的乘积,其中T,D*是正交矩阵,也就是说T,D*和其自身的转置的乘积是一个单位矩阵,S为对角矩阵。
S为XX*的特征值的开根号;
T为XX*的特征向量;
D为X*X的特征向量;
值得注意的是这里的TS的乘积可以表示为单词的坐标;
         DS的乘积可以表示为文章的坐标;
举个例子:
这里有9篇文章对其做向量空间模型的转换:
进行奇异值分解:

其中的S矩阵的各个量的大小表示隐含属性的比重大小,因此可以进行挑选其中较大的几个属性,将对结果影响不大的进行剔除,这样就可以排除噪声的影响。

这里不妨取两个最大的值,并将精简后的三个矩阵乘起来,可以看到矩阵的变化并不大。

Term的向量表示为TS,将坐标画出来如图:

Document的向量表示为DS,将坐标画出来如图:

可以看出聚类的效果还是比较好的,再通过求cosine值,就可以更好的进行相似性分析。可以看出,进行了隐含语义分析的矩阵的相似度分析的值更大,也就是表示区分度更大,更容易区分。

对于一篇陌生的文档如何进行区分呢,以下给出了一种解法

 
具体思路就是q=TSD,使用已经得到的TS==>计算出D,然后得到DS,最后进行相似性分析。
 
二、PageRank
以上讲的是文章的推荐,这里提一下网页的推荐算法PageRank算法。
佩奇排名(PageRank),又称网页排名谷歌左侧排名,是一种由搜索引擎根据网页之间相互的超链接计算的技术,而作为网页排名的要素之一,以Google公司创办人拉里·佩奇(Larry Page)之姓来命名。Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。
简单来说,一个页面的PageRank是由所有链向它的页面(“链入页面”)的重要性经过递归算法得到的。
Google把从A页面到B页面的链接解释为A页面给B页面投票,投票的重要性依赖于网页自身的PageRank值和他推荐网页的数目。
我个人认为这个算法的合理性在于:
 
  • 网页的PageRank值由指向他的网页决定,而非由自身的链接决定,这就一定程度上避免了一个网页为了提高PageRank值而广扩链接;
  • 投票的重要性和推荐网页的数目有关,类比于保研教授推荐,如果该教授经常推荐那么其效力就会下降,如果该老师只推荐了很少的同学而你就是其中之一,那么效力就会高很多。
简易版本:
举个例子:
完整版本:
引入了时间量,公式如下。
也就是说对Pi网页的PageRank值等于上一个时刻的PageRank值乘以一个damping factor,也就是一个衰减值。
最后还要加上一个数保证所有的PageRank值为1。
初始条件下所有的PageRank值为1/N。
也可以采用矩阵的方式来表述:
 
三、协同过滤

协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最近有什么好看的电影推荐,而我们一般更倾向于从口味比较类似的朋友那里得到推荐。这就是协同过滤的核心思想。

协同过滤算法的工作流程:

  1. 创建打分矩阵
  2. 通过矩阵得到相似度高的用户群
  3. 推荐那些各个用户群里打分高的产品

协同过滤主要分为三类:

  1. 基于用户的协同过滤推荐(User-based Collaborative Filtering Recommendation)
  2. 基于项目的协同过滤推荐(Item-based Collaborative Filtering Recommendation)
  3. 基于模型的协同过滤推荐(Model-based Collaborative Filtering Recommendation)

1)基于用户的协同过滤推荐(User-based Collaborative Filtering Recommendation)

 

 

公式一用来计算u,v两个用户的相关系数,相关系数|w|<=1,如果|w|=1,则两者成线性相关

公式二用来计算用户a的i个项的打分,根据各个用户之间的相关系数进行计算。这里的U是指那些对i进行了打分的用户。
举个例子:

 

2基于项目的协同过滤推荐(Item-based Collaborative Filtering Recommendation)

方法一、与User-based CF进行类比,既然基于用户的协同过滤是采用的计算用户之间的相关系数,最后得到未知的item的打分,那么,Item-based CF也可以使用相关系数进行计算。

同样的公式一用于计算i,j两件商品的相关性,

公式二用于计算用户a的对商品i的打分。

当然,也可以不使用这种类比的方式来进行计算,也有其他的更讨巧的方法。

方法二、通过其他用户第i项与平均值的差来估算用户a。

值得注意的是,这里的ru的平均值是值不包含第i件商品的均值。
方法三、首先计算其他项与第i项的平均差距,然后使用这个差距来估算用户a的第i件商品的值。
举个例子:
 
3)基于模型的协同过滤推荐(Model-based Collaborative Filtering Recommendation)
Model-based CF是把推荐问题转成分类问题,比如转换成Naive Bayes来进行判断在哪个类的概率比较大。
举个例子:
这里的U2,U3,U4,U5是特征属性,U1是标签。
对于非打分类的空值的处理,可以使用以下的方式予以解决:
 
 
 
 
posted @ 2017-12-15 19:08  hyserendipity  阅读(1303)  评论(0编辑  收藏  举报