论文:个性化推荐系统的研究进展
发表时间:2009
发表作者:刘建国,周涛,汪秉宏
论文链接:论文链接

本文发表在2009,对经典个性化推荐算法做了基本的介绍,是非常好的一篇中文推荐系统方面的文章。
个性化推荐系统通过建立用户与信息产品之间的二元关系 , 利用已有的选择过程或相似性关系挖掘每个用户潜在感兴趣的对象 , 进而进行个性化推荐, 其 本质就是信息过滤
事实上, 它是目前解决信息过载问题最有效的工具 。文中根据推荐算法的不同, 分别介绍了协同过滤系统, 基于内容的推荐系统 , 混合推荐系统 , 以及当时兴起的基于用户—产品二部图网络结构的推荐系统。并结合这些推荐系统的特点以及存在的缺陷, 提出了改进的方法和未来可能的若干研究方向。

一个完整的推荐系统由 3 个部分组成:收集用户信息的行为记录模块, 分析用户喜好的模型分析模块和推荐算法模块。行为记录模块负责记录用户的喜好行为, 例如问答 、 评分 、 购买、 下载、 浏览等。模型分析模块的功能能够对用户的行为记录进行分析, 建立合适的模型来描述用户的喜好信息 。最后是推荐算法模块 , 利用后台的推荐算法, 实时地从产品集合中筛选出用户感兴趣的产品进行推荐 。其中 , 推荐算法模块是推荐系统中最为核心的部分。

协同过滤系统

协同过滤系统是第一代被提出并得到广泛应用的推荐系统 。 其核心思想可以分为两部分:首先,是利用用户的历史信息计算用户之间的相似性 ;然后 , 利用与目标用户相似性较高的邻居对其他产品的评价来预测目标用户对特定产品的喜好程度。 系统根据这一喜好程度来对目标用户进行推荐 。协同过滤推荐系统最大的优点是对推荐对象没有特殊的要求, 能处理音乐、 电影等难以进行文本结构化表示的对象。
协同过滤推荐系统的算法可以分为两类:基于记忆(memory-based)的和基于模型的(model-based)的算法。
基于记忆的算法根据系统中所有被打过分的产品信息进行预测。设C为用户集合,S为产品集合,设\(r_{c,s}\)为用户c对产品s的打分。设$ \hat C$ 为与用户\(c\)相似度比较高的用户集 , 预测\(r_{c, s}\)的函数形式有 :
\[
r_{c, s}=\frac{1}{N} \sum_{e \in \hat C} r_{e,s}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1) \\
r_{c, s}=k \sum_{\overline c \in \hat C} sim(c,\overline c) \circ r_{\overline c,s} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2) \\
r_{c, s}= \overline r_c + k\sum_{e \in \hat C} sim(c,\overline c) \circ (r_{\overline c,s}-\overline r_c) \ \ \ (3) \\
\]
其中 \(k\)为一个标准化因子,通常$ k=1/\sum_{\overline c \in \hat C} |sim(c,\overline c)|$。
\(sim(i , j)\)表示用户 i 和j 之间的相似性。用户\(c\)的平均打分$\overline r_c \(定义为\)\overline r_c=(1/|s_c|)\sum_{s \in S_c}r_{c,s}\(,其中\)S_c={s \in S|r_{c,s} \neq 0}$
如公式(1)所示 ,最简单的计算方法就是直接计算邻居打分的平均值 。然而, 最常用的计算方法却是加权平均(2),其中 \(sim(c, \overline c)\)为用户$ c \(和\)\overline c\(的相似性 。如果用户\) c \(和\)\overline c\(越像 ,\)r_{\overline c,s}\(将有更大的权重用于预测\) r_{ c, s}$ 。由于(2)应用了标准化因子$ k $, 因此(2)可以用于计算不同的推荐系统中的用户相似性度量 。应用(2)时 , 尽管使用了加权和, 但是并没有考虑不同用户的评价尺度不一样的问题。(3)通过只考虑不同用户平均喜好程度的偏差, 克服了评判尺度不一致的缺点 , 一般而言具有比(2)更高的精确度 。另外,偏好过滤是另一个克服用户打分尺度不一的方法 。该方法注重于预测用户的相对偏好 ,而不是评分绝对值。
协同过滤系统中已经采用了很多种方法计算用户之间的相似度。这些算法中, 大部分都是基于用户对共同喜好产品的打分。两个最常用的方法是 Pearson 相关性夹角余弦。一个普遍采用的策略就是提前计算所有用户的相似性 \(sim(x , y)\), 隔一段时间进行一次更新 。用户需要推荐时,可以用事先计算好的相似性结果进行有效推荐。

许多改进算法已经被广泛研究并且应用到标准的相关性计算和夹角余弦公式中 。例如缺席投票(default voting), 事例引申(case amplification)和加权优势预测等。

基于模型的算法收集打分数据进行学习并推断用户行为模型, 进而对某个产品进行预测打分 。基于模型的协同过滤算法和基于记忆的算法的不同在于,基于模型的方法不是基于一些启发规则进行预测计算 , 而是基于对已有数据应用统计和机器学习得到的模型进行预测。基于模型的协同过滤推荐系统有概率相关模型, 极大熵模型, 线性回归, 基于聚类的 Gibbs 抽样算法, Bayes 模型等等。

虽然协同过滤推荐系统得到了广泛的应用 , 但是也面临很多问题 , 例如如何对新用户进行推荐或如何推荐新产品给用户(冷启动问题), 打分稀疏性问题, 算法可扩展性问题等。另外, 基于用户的协同推荐算法随着用户数量的增多 , 计算量成线性加大 , 其性能会越来越差 。因此有的推荐系统采用基于产品相似性的协同过滤算法, 在产品的数量相对稳定的系统中, 这种方法是很有效的。

基于内容的推荐系统

历史上 , 最初的基于内容的推荐(content-based recommendation)是协同过滤技术的延续与发展,它不需要依据用户对项目的评价意见, 而是依据用户已经选择的产品内容信息计算用户之间的相似性 , 进而进行相应的推荐。随着机器学习等技术的完善, 当前的基于内容的推荐系统可以分别对用户和产品建立配置文件, 通过分析已经购买(或浏览)过的内容, 建立或更新用户的配置文件。系统可以比较用户与产品配置文件的相似度 , 并直接向用户推荐与其配置文件最相似的产品。

基于内容的推荐算法的根本在于信息获取和信息过滤。因为在文本信息获取与过滤方面的研究较为成熟, 现有很多基于内容的推荐系统都是通过分析产品的文本信息进行推荐。

总结起来, 基于内容推荐的优点有 :
(1)可以处理新用户和新产品问题(冷启动)。由于新用户没有选择信息, 新产品没有被选信息,因此协同过滤推荐系统无法处理这类问题。但是基于内容的推荐系统可以根据用户和产品的配置文件进行相应的推荐 。
(2)实际系统中用户对产品的打分信息非常少,协同过滤系统由于打分稀疏性的问题 , 受到很大的限制 。基于内容的推荐系统可以不受打分稀疏性问题的约束 。
(3)能推荐新出现的产品和非流行的产品 , 能够发现隐藏的 “暗信息” 。
(4)通过列出推荐项目的内容特征, 可以解释为什么推荐这些产品。使用户在使用系统的时候具有很好的用户体验。
基于内容的推荐系统不可避免地受到信息获取技术的约束 , 例如自动提取多媒体数据(图形、视频流、 声音流等)的内容特征具有技术上的困难,这方面的相关应用受到了很大限制。下一节我们将介绍基于用户 —产品二部图网络结构的推荐算法,该算法不仅可以不受信息挖掘技术的制约, 而且可以解决协同过滤推荐系统中打分稀疏性和算法可扩展性等问题 。但此类算法仍然难以从根本上解决冷启动问题。

基于网络结构的推荐算法

基于网络结构的推荐算法不考虑用户和产品的内容特征, 而仅仅把它们看成抽象的节点, 所有算法利用的信息都藏在用户和产品的选择关系之中。

基于二部分图资源分配的推荐算法

考虑一个由\(m\)个用户和\(n\)个产品构成的推荐系统, 其中如果用户\(i\)选择过产品\(j\), 就在\(i\)和$ j $之间连接一条边 \(a_{ji} =1,(i =1 ,2 , …, m ;j =1 , 2 , …, n)\) 否则$ a_{ji} =0 \(。由此 ,这个系统可以用一个具有\) m +n $个节点的二部分图表示。对于任意目标用户 \(i\), 推荐算法的目的是把所有\(i\)没有选择过的产品按照$ i \(喜欢的程度进行排序 , 并且把排名靠前的那些产品推荐给\)i\(。假设\)i\(选择过的所有产品, 都具有某种向\)i\(推荐其他产品的能力。这个抽象的能力可以看做位于相关产品上的某种可分的资源 ———拥有资源的产品会把更多的资源交给自己更青睐的产品。对于有\) m\(个用户和\)n\(个产品的一般的推荐系统, 如果用表示\)w_{ij}\(产品\)j\(愿意分配给产品\)i\(的资源配额, 可以得到\)w_{ij}$的一般表达式。
\[
w_{ij} = \frac{1}{k_j} \sum_{l=1}^m \frac{a_{il}a_{jl}}{k_l}
\]
其中\(k_j\)表示产品\(j\)的度(被多少用户选择过),$ k_l\(表示用户\)l$的度(该用户选择过多少产品)。
对于给定的一个目标用户, 将他选择过的产品上的初始资源设为\(1\), 其他设为\(0\)。这样得到一个 n维的 0/1 矢量, 代表针对该个体的初始资源分配构型。显然 , 这个初始构型表达了个性化信息, 对于不同用户是不一样的。记这个矢量为\(f\), 通过上述过程得到的最终的资源分配矢量可以表示为
\[ f′= Wf \]
把目标用户没有看过的所有产品, 按照矢量\(f′\)中对应元素的大小进行排序———值越大就说明该用户越喜欢(这些产品在那些已经被选择过的产品心目中总的分量最重)。排序靠前的产品, 可以推荐给目标用户。

混合推荐系统

协同过滤, 基于内容 , 以及基于网络结构的推荐算法在投入实际运营的时候都有各自的缺陷, 因此实际的推荐系统大多把不同的推荐算法进行结合, 提出了混合推荐算法。针对实际数据的研究显示这些混合推荐系统具有比上述独立的推荐系统更好的准确率。目前, 最常见的混合推荐系统是基于协同过滤和基于内容的 , 同时也发展出了其他类型的组合 , 下面简单进行介绍。

独立系统相互结合的推荐系统

建立混合推荐系统的方法之一即是独立地应用协同过滤, 基于内容和基于网络结构的算法进行推荐 。然后将两种或多种系统的推荐结果结合起来 ,利用预测打分的线性组合进行推荐。又或者 ,只推荐某一时刻在某一个评价指标下表现更好的算法的结果。

在协同过滤系统中加入基于内容的算法

包括Fab在内的一些混合推荐系统都是基于内容的协同过滤算法 。即利用用户的配置文件进行传统的协同过滤计算 。用户的相似度通过基于内容的配置文件计算而得, 而非共同打过分的产品的信息。这样可以克服协同过滤系统中的稀疏性问题。这个方法的另一个好处就是不仅仅当产品被配置文件相似的用户打了分才能被推荐 , 如果产品与用户的配置文件很相似也会被直接推荐。

其他推荐算法

除了上文介绍的几类推荐算法, 实际系统中还存在其他推荐算法。首先是关联规则分析 。关联规则关注用户行为的关联模式, 例如, 购买香烟的人大都会购买打火机, 因此可以在香烟和打火机之间建立关联关系。通过这种关联关系向用户推荐其他产品。

结束语与展望

(1)协同过滤推荐系统面临新用户,新产品,打分稀疏性和算法可扩展性等问题 。基于模型的算法虽然可以在一定程度上解决算法的可扩展性问题, 但是该类算法往往比较适于用户的兴趣爱好比较稳定的情况 , 因为它要考虑用户模型的学习过程以及模型的更新过程 ,对于最新信息的利用比协同过滤算法要差些。
(2)基于内容的推荐系统受到信息获取技术 ,专业化程度过高等因素的制约。在基于内容的推荐系统中 , 用户或产品特征集的内容都必须能被计算机自动抽取出来 , 因此该类算法受到信息获取技术的严重制约。例如多媒体数据(图形、 视频流、 声音流等)在特征自动提取上就存在很大困难。
(3)基于网络结构的推荐算法受到新用户、新产品等问题的制约。利用网络结构的推荐算法的根本是要建立用户—产品二部图关联网络 。新用户或新产品刚进入系统时没有任何选择或被选信息 , 系统无法与其他用户或产品建立关联网络 , 因此也无法启动基于网络结构的推荐算法。如果考虑新用户或产品的配置文件 , 可以在一定程度上解决新用户或新产品问题 。同时关联网络的建立还受到用户选择关系建立时间的影响 。如果把用户与产品的所有关联关系都考虑在内, 就无法区分用户的长期兴趣点和短期兴趣点 。过多地考虑长期兴趣点会使得系统无法给出满足用户短期兴趣的产品 , 从而使得推荐的准确度大大降低。如何在基于网络的推荐中加入历史时间的影响, 是一个值得关注的问题 。

除了上述讨论之外, 目前所有的推荐系统都面临着一些具有共性的问题。这些问题的解决可以从根本上极大地促进推荐系统的研究与应用 。例如, 用户和产品的信息是动态改变的(新用户的加入, 新产品的加入, 用户选择或评价已经存在的产品 ……), 如果每次改变都需要完全重新计算, 这个计算量是巨大的, 比较可行的方案是设计某种近似的动态算法,每次都只是局部改变原来的算法结果 , 而不需要完全的重新的计算 。针对不同的推荐系统 , 如何选择合适的评价指标对推荐效果进行评判是推荐系统研究的重要问题。

最新文章

  1. Linux Socket 网络编程
  2. http status 301/302 & java重定向/转发
  3. 由360手机卫士谈起——让你的service获取最高权限。
  4. 【转】Intel RealSense(实感技术)概览
  5. 学DIV+CSS技术,如何入门?(2)
  6. MSSQL死锁产生原因及解决方法
  7. import Tkinter的时候报错
  8. POJ 1745
  9. I.MX6 android 获取framebuffer信息
  10. oracle锁
  11. 功能模块图、业务流程图、处理流程图、ER图,数据库表图(概念模型和物理模型)画法
  12. C++类型转换总结 转
  13. (转)SQL流程控制语句学习(二):begin…end if…else case
  14. jquery.proxy的四种使用场景及疑问
  15. c++ 库函数返回的字符串指针是否需要手动释放
  16. c#字符编码,System.Text.Encoding类,字符编码大全:如Unicode编码、GB18030、UTF-8,UTF-7,GB2312,ASCII,UTF32,Big5
  17. Android 基础:常用布局 介绍 & 使用(附 属性查询)
  18. 华为指标OceanStore
  19. Linux-004-解决 Tomcat 启动时提示 Insufficient space for shared memory file
  20. HBase 笔记1

热门文章

  1. APK在Android Studio下如何签名
  2. go timer定时器 WaitGroup用法
  3. rebbitMQ的实现原理
  4. 【转】Entity Framework简介
  5. IOS IAP APP内支付 Java服务端代码
  6. Java 最常见 200+ 面试题 + 全解析
  7. Python--yaml文件写入
  8. 20191011-构建我们公司自己的自动化接口测试框架-Util的AssertResult模块
  9. Once in a casino CodeForces - 1120B (暴力)
  10. PHP trait介绍