推荐算法
目前主流的推荐算法主要包含内容关联算法, 协同过滤算法。算法
内容关联算法(Content-Based)
CB算法的原理是将一个item的基本属性, 内容等信息提取出来, 抽成一个taglist, 为每一个tag赋一个权重。服务器
剩下的事情就跟一个搜索引擎很是相似了, 将全部item对应的taglist作一下倒排转换, 放到倒排索引服务器中存储起来。markdown
当要对某一个item作相关推荐的时候, 将这个item对应的taglist拿出来拼成一个相似搜索系统中的query表达式, 再将召回的结果作一下排序做为推荐结果输出。cookie
当要对某个用户作个性化推荐的时候, 将这个用户最近喜欢/操做过的item列表拿出来, 将这些item的taglist拿出来并merge一下做为用户模型, 并将这个模型的taglist请求倒排索引服务, 将召回的结果做为候选推荐给该用户。网络
该算法的好处是:post
- 不依赖于用户行为, 即不须要冷启动的过程, 随时到随时都能推荐
- 能够给出看起来比较合理的推荐解释
- item被推荐的时效性能够作得很高, 好比新闻类产品就须要用到该算法
该算法的坏处是:优化
- 须要理解item的内容, 对音频/视频等很差解析内容的就很差处理了
- 对于一次多义以及一义多词等状况处理起来比较复杂
- 容易出现同质化严重的问题, 缺少惊喜
协同过滤算法(collaborative filtering)
简介
CF算法的原理是汇总全部<user,item>的行为对, 利用集体智慧作推荐。其原理很像朋友推荐, 好比经过对用户喜欢的item进行分析, 发现用户A和用户B很像(他们都喜欢差很少的东西), 用户B喜欢了某个item, 而用户A没有喜欢, 那么就把这个item推荐给用户A。(User-Based CF)搜索引擎
固然, 还有另一个维度的协同推荐。即对比全部数据, 发现itemA和itemB很像(他们被差很少的人喜欢), 那么就把用户A喜欢的全部item, 将这些item相似的item列表拉出来, 做为被推荐候选推荐给用户A。(Item-Based CF)spa
如上说的都是个性化推荐, 若是是相关推荐, 就直接拿Item-Based CF
的中间结果就好啦。code
该算法的好处是:
- 能起到意想不到的推荐效果, 常常能推荐出来一些惊喜结果
- 进行有效的长尾item
- 只依赖用户行为, 不须要对内容进行深刻了解, 使用范围广
该算法的坏处是:
- 一开始须要大量的
<user,item>
行为数据, 即须要大量冷启动数据 - 很难给出合理的推荐解释
原理
协同过滤算法具体实现的时候, 又分为典型的两类:
-
基于领域的协同过滤算法
这类算法的主要思想是利用
<user,item>
的打分矩阵, 利用统计信息计算用户和用户, item和item之间的类似度。而后再利用类似度排序, 最终得出推荐结果。常见的算法原理以下:
-
User-Based CF
先看公式:
该公式要计算用户i和用户j之间的类似度, I(ij)是表明用户i和用户j共同评价过的物品, R(i,x)表明用户i对物品x的评分, R(i)头上有一杠的表明用户i全部评分的平均分, 之因此要减去平均分是由于有的用户打分严有的松, 归一化用户打分避免相互影响。
该公式没有考虑到热门商品可能会被不少用户所喜欢, 因此还能够优化加一下权重, 这儿就不演示公式了。
在实际生产环境中, 常常用到另一个相似的算法
Slope One
, 该公式是计算评分误差, 即将共同评价过的物品, 将各自的打分相减再求平均。 -
Item-Based CF
先看公式:
该公式跟User-Based CF是相似的, 就再也不重复解释了。
这类算法会面临两个典型的问题:
- 矩阵稀疏问题
- 计算资源有限致使的扩展性问题
基于此, 专家学者们又提出了系列基于模型的协同过滤算法。
-
-
基于模型的协同过滤算法
基于模型的研究就多了, 常见的有:
- 基于矩阵分解和潜在语义的
- 基于贝叶斯网络的
- 基于SVM的
这儿只简单介绍一下基于矩阵分解的潜在语义模型的推荐算法。该算法首先将稀疏矩阵用均值填满, 而后利用矩阵分解将其分解为两个矩阵相乘, 以下图:
看一个实际的例子:
这个例子中, 原始矩阵中包含了网页的Title和切词后的term之间关系, 能够类比为推荐系统中的评分。而后用SVD作矩阵分解以后, 针对每一个term会对应一个3维向量, 针对每一个Title也会对应一个3维向量。
那么接下来能够作的事情就不少了, 若是要计算term和title的类似度, 只须要将这两个3为向量作内积获得的分值便可;
还能够将term和title都投影到这3维空间中, 而后利用各类聚类算法, 将用户和item, item和item, 用户和用户的分类都给求出来。
该算法的核心是在于作矩阵分解, 在矩阵大了的状况下计算量是很是夸张的, 在实际生产环境中会经常使用梯度递归降低方法来求得一个近似解。
-
组合推荐技术
其实从实践中来看, 没有哪一种推荐技术敢说本身没有弊端, 每每一个好的推荐系统也不是只用一种推荐技术就解决问题, 每每都是相互结合来弥补彼此的不足, 常见的组合方式以下:
- 混合推荐技术: 同时使用多种推荐技术再加权取最优;
- 切换推荐技术: 根据用户场景使用不一样的推荐技术;
- 特征组合推荐技术: 将一种推荐技术的输出做为特征放到另外一个推荐技术当中;
- 层叠推荐技术: 一个推荐模块过程当中从另外一个推荐模块中获取结果用于本身产出结果;
Item-CF和User-CF选择
- user和item数量分布以及变化频率
- 若是user数量远远大于item数量, 采用Item-CF效果会更好, 由于同一个item对应的打分会比较多, 并且计算量会相对较少
- 若是item数量远远大于user数量, 则采用User-CF效果会更好, 缘由同上
- 在实际生产环境中, 有可能由于用户无登录, 而cookie信息又极不稳定, 致使只能使用item-cf
- 若是用户行为变化频率很慢(好比小说), 用User-CF结果会比较稳定
- 若是用户行为变化频率很快(好比新闻, 音乐, 电影等), 用Item-CF结果会比较稳定
- 相关和惊喜的权衡
- item-based出的更偏相关结果, 出的可能都是看起来比较相似的结果
- user-based出的更有可能有惊喜, 由于看的是人与人的类似性, 推出来的结果可能更有惊喜
- 数据更新频率和时效性要求
- 对于item更新时效性较高的产品, 好比新闻, 就没法直接采用item-based的CF, 由于CF是须要批量计算的, 在计算结果出来以前新的item是没法被推荐出来的, 致使数据时效性偏低;
- 可是能够采用user-cf, 再记录一个在线的用户item行为对, 就能够根据用户最近相似的用户的行为进行时效性item推荐;
- 对于像影视, 音乐之类的仍是能够采用item-cf的;