引言: 当前推荐系统应用十分火爆,可以使系统的使用者感受到“量身定做”的服务,如网易云音乐的个性化推荐1,当当京东的推荐购买等;同时给内容企业及电商如Netflix、亚马逊、Youtube等带来巨大的收入,2009年由Netflix发起的Netflix Prize百万美元美金竞赛,将这项技术从学术界真正引入了商业界2,另据VentureBeat统计,Amazon的推荐系统为其提供了35%的商品销售额。
本文介绍几种推荐算法:协同过滤,矩阵分解,KNN方法,随机游走算法(RW)
目录:
1 协同过滤
协同过滤(collaborative filtering)是迄今为止应用最成功的个性化推荐技术。分为用户对用户(user-user)与内容对内容(item-item)两种算法。用户对用户的基本思想是根据用户兴趣的相似性来推荐资源,把和当前用户相似的其他用户的意见提供给当前用户。内容对内容的算法及步骤与用户对用户相同,其不同的地方在于内容对内容是寻找相似的内容,并向用户推荐相似的内容。
1.1算法原理
(1) 基于用户(user)的协同过滤
基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群,在一般的应用中是采用计算“K- 邻居”的算法;然后,基于这 K 个邻居的历史偏好信息,为当前用户进行推荐。
如上图所示,用户A喜欢物品A与用户C,用户B喜欢物品C,用户C喜欢物品A与物品D,从这些用户的历史喜好信息中,我们可以发现用户 A 和用户 C 的口味和偏好是比较类似的,同时用户 C 还喜欢物品 D,那么我们可以推断用户 A 可能也喜欢物品 D,因此可以将物品 D 推荐给用户 A。
基于用户的协同过滤推荐机制和基于人口统计学的推荐机制都是计算用户的相似度,并基于“邻居”用户群计算推荐,但它们所不同的是如何计算用户的相似度,基于人口统计学的机制只考虑用户本身的特征,而基于用户的协同过滤机制可是在用户的历史偏好的数据上计算用户的相似度,它的基本假设是,喜欢类似物品的用户可能有相同或者相似的口味和偏好。
(2)基于项目(item)的协同过滤
基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。
用户A喜欢物品A和C,用户B喜欢A和C,用户C喜欢A,我们发现喜欢物品A的人同时也喜欢物品C,因此将C物品推荐给C。
基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。
1.2 算法优缺点
优点
基于协同过滤的推荐机制是现今应用最为广泛的推荐机制,它有以下几个显著的优点:
1. 领域无关的
2. 经验公用。可以发现用户潜在爱好
缺点
- 利用历史偏好数据,容易出现冷启动,依赖于用户历史偏好数据的多少和准确性。
- 用户历史偏好是用稀疏矩阵进行存储的,而稀疏矩阵上的计算有些明显的问题,包括可能少部分人的错误偏好会对推荐的准确度有很大的影响等等。
- 由于以历史数据为基础,抓取和建模用户的偏好后,很难修改或者根据用户的使用演变,从而导致这个方法不够灵活。
1.2 算法实现步骤
其实现步骤分为以下两步:
1.2.1相似度度量
假设两个用户或商品x或y的对于的评价分数向量为 x⃗ x → 、 y⃗ y → , x⃗ x → 中包含的评分向量元素为 rx,i r x , i , y⃗ y → 中包含的评分向量元素为 rx,i r x , i ,则可以根据以下距离公式来评价用户/物品之间相似程度。
余弦距离:
sim(x,y)=cos(x⃗ ,y⃗ )=x⃗ ⋅y⃗ ||x⃗ ||×||y⃗ ||=∑i∈Ixyrx,iry,i∑i∈Ixr2x,i−−−−−−√∑i∈Iyr2y,i−−−−−√ sim ( x , y ) = cos ( x → , y → ) = x → ⋅ y → | | x → | | × | | y → | | = ∑ i ∈ I x y r x , i r y , i ∑ i ∈ I x r x , i 2 ∑ i ∈ I y r y , i 2
可以把余弦距离想象成空间中不同的向量之间的角度,计算出来的余弦值越大,两个向量就越相似,反之同理。皮尔森协同系数
sim(x,y)=corr(x⃗ ,y⃗ )=cov(x⃗ ,y⃗ )σx⃗ σy⃗ =∑i∈Ixy(rx,i−rx¯)(ry,i−ry¯)∑i∈Ixy(rx,i−rx¯)2−−−−−−−−−−−−√∑i∈Ixy(ry,i−ry¯)2−−−−−−−−−−−−√ sim ( x , y ) = c o r r ( x → , y → ) = c o v ( x → , y → ) σ x → σ y → = ∑ i ∈ I x y ( r x , i − r x ¯ ) ( r y , i − r y ¯ ) ∑ i ∈ I x y ( r x , i − r x ¯ ) 2 ∑ i ∈ I x y ( r y , i − r y ¯ ) 2
皮尔森系数其实是 x⃗ x → , y⃗ y → 的协方差除以两个变量的标准差得到的,根据正负以及大小来判断两个向量的相似程度。
1.2.1 根据相似度评分进行预测
计算完每个用户或内容与其他用户或内容的相似程度之后,我们该怎么办呢?
我们需要给出一个用户评分或是内容评分向量作为推荐系统给出的推荐结果,预测方法如下:
假设要给用户 c c 推荐电影,为 k k 个用户的电影评分数据集,这个用户中有 s s 个共同评价的内容和是一样的,且评分内容为 rds,d∈D r d s , d ∈ D ,因此计算需要推荐的内容评分向量 rcs r c s 。具体的如果
- 简单取平均值
- 利用相似度做加权平均值
最后得到的 rcs r c s 即为为用户 r r 推荐的电影分数向量。设置一个阈值,取合格的电影作为预测结果。
2. 矩阵分解
这是一种“凭感觉”的算法。
矩阵分解(Matrix Factorization)矩阵分解是将矩阵因式分解,即找出两个(或更多)矩阵,这样当你乘以它们时,就可以得到原始矩阵。
2.1 算法原理
虽然基于用户或基于项目的协作过滤方法简单直观,但矩阵分解技术通常更有效,因为它们使我们能够发现用户和项目之间相互作用的潜在特征(latent features).
假如有个用户和
D
D
个项目,大小为 大小的矩阵
R
R
作为评级矩阵,假设我们想找到个潜在特征(latent features),我们就需要找到两个矩阵
P
P
(大小为)和
Q
Q
(大小为),使他们的乘积
R^
R
^
接近于
R
R
,代表用户与功能之间的关联强度,
Q
Q
代表项目与功能的关联强度.
寻找到那个近似矩阵 R^ R ^ ,就是要推荐的评分内容.
2.1 算法实现
因此,矩阵分解的实现方法如下:
(1)初始化矩阵 P P 和
初始化两个大小分别为
|U|∗K
|
U
|
∗
K
和
|D|∗K
|
D
|
∗
K
的矩阵
P
P
和,计算他们的乘积与
R
R
的差异,通过迭代的方法找到差异的最小值。
(2)通过梯度下降方法减小误差
先计算上式的微分:
得到迭代矩阵元素:
* 计算用户对于电影的打分
通过 P P 和的点乘运算得到用户 ui u i 对于电影 di d i 的预测评分 r^ r ^ :
再设置阈值来给出推荐选项,最后通过设置误差函数使得误差数字减小。
在计算误差时还可以使用正则化方法来优化。
3.kNN用于推荐
k -NN是一种基于实例的学习,或者是懒学习(lazy learning),其中函数只是在本地进行逼近,所有的计算都被推迟到分类或是拟合那一步进行.
主要有三要素:k值的选择,距离度量,推荐决策的规则
实现步骤有两步:
根据距离来定义k个“邻居”
可以使用欧几里得距离,汉明距离,及余弦距离或是皮尔森协同系数。通过多数表决,决定应该给 c c <script type="math/tex" id="MathJax-Element-116">c</script>推荐的内容
4.随机游走算法
(1)选择N步作为随机步数的总数,即停止的目标;
(2)从初始点开始( starting point),我们走得每一步都有一个概率,来决定我们继续或是重新开始(回到初始
点);
(3)当你决定要继续random walk时,你会统一(如果你的边是带有权重的,你可以做权重采样)随机地
从接下来的点(node)里选择一个邻居。接下来跳到选择的邻居那里。这样就完成了N步中的一部。
(4)接下来
我们重复以上过程;
(5)当我们randomwalk时,到最后统计我们跳到同样的点的次数,最多次数的那个点就是
我们的推荐内容。
参考:
1.推荐机制 协同过滤和基于内容推荐的区别
2.推荐引擎初探