推荐系统,顾名思义,就是向用户推荐物品或信息的系统。
推荐系统在我们的生活中随处可见:
我们为什么需要推荐系统?
对于用户而言(信息消费者),面对网上海量的信息,要从中找出我们感兴趣的信息,是一件非常难的事情。比如某一天我们闲来无事,想看一部电影解解闷,可是市面上的电影实在太多了,一时也不知道该看哪部电影。这时,推荐系统就可以为你选择一部你最可能感兴趣的电影。治好了你的选择困难症。
对平台而已(信息生成者),如何让自己生产的信息被广大用户关注到也是一个非常困难的事。而推荐系统就可以将这些信息针对性的推送给需要的人。拿电商平台举例,如果将用户感兴趣的物品放在用户浏览的首页,那么该物品被对应用户消费的概率将极大的提升,从而提高电商平台的销量。对于内容平台来说,好的推荐系统可以更好的留住用户,提高平台的用户留存率。
另外,推荐系统可以更好的发掘物品的长尾。
在了解长尾理论,先来看一个非常著名的定律:82定律。82定律相信在座的大家应该都有所耳闻。
82原则也叫二八定律,正规叫法是巴莱多定律。巴莱多定律是1897年意大利经济学家巴莱多提出的。他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的,因此又称二八法则。
82定律在我们的生活中普遍适用:80%的销售额都来自于20%的热门商品,20%的人占据了社会财富的80%,80%的业务收入是由20%的客户创造的,20%的强势品牌,占有80%的市场份额。
然而,这个定律在互联网时代受到了挑战。美国《连线》杂志主编克里斯·安德森在2004年发表了"The Long Tail"一文并于2006年出版了《长尾理论》一书。该书指出,传统的82原则在互联网的加入下会受到挑战。
在互联网的条件下,由于货架成本低端低廉,电子商务网站往往能出售比传统零食店更多的商品。虽然这些商品绝大数都不热门,但是数量却极其庞大,总体销售额并不会输给那些热门商品。
这里我们将那些不热门的商品统称为长尾商品,热门的成为头部商品。
在传统的82定律中,头部商品的销售额可能是80%,长尾商品的销售额可能仅20%
在长尾理论中,得利于互联网低廉的货架成本,长尾商品的销售额能得到50%甚至更多。
一般而言,头部商品代表了绝大数用户的需求,而长尾商品往往代表了一小部分用户的个性化需求。因此,如果想通过发掘长尾提高销售额,就必须充分研究用户的兴趣,这正是个性化推荐系统主要解决的问题。
举个例子,某个用户喜欢玩游戏,尤其偏好动作类游戏,但是如今市面上的游戏实在太多了,用户不可能全部都了解。但有了推荐系统后,游戏平台就可以根据该用户的爱好,给他推送一些他没玩过的冷门但口碑不错的动作游戏。这类冷门的动作游戏就属于长尾商品,如果没有推荐系统主动推荐,大部分用户都不会找到并购买这些游戏。
因此,推荐系统可以很好的发掘那些长尾物品的销量。
抛开推荐系统,我们先想象一下在生活中面对很多选择时做决定的过程。我们以看电影为例,假设我们一时不知道要看什么电影,那么我们可能采用如下方式来决定最终要看什么电影:
从上面的方法可以看出,推荐算法的本质是通过一定的方式将用户和物品联系起来,不同的推荐系统使用了不同的方式。上面的例子让我们了解了两种实现推荐系统的方式:
如果仔细琢磨,会发现这两个方式有个共同点,那就是寻找相似。是的,基于内容的推荐需要寻找相似的物品,基于协同过滤的推荐需要寻找兴趣相似的用户。那么,如果定义物品之间的相似度以及用户之间的相似度,是一个很重要的命题。
要判断物品、用户之间的相似度,需要一定的算法。目前常见的相似度算法有:
下面我们分别使用杰卡德相似系数和余弦相似度为大家介绍一下如何计算物品或用户之间的相似度。
假设现在有4个用户,他们的购买行为如下:
用户标识 | 购买物品列表 |
---|---|
u1 | a、b、d、e |
u2 | a、c |
u3 | b、c、d |
u4 | a、c、d、e |
我们来看一下如何利用杰卡德相似系数来计算这些用户之间的相似度。首先杰卡德系数的计算公式如下:
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ = A 和 B 的交集 A u n i o n B J(A, B)=\frac{|A \cap B|}{|A \cup B|}=\frac{|A \cap B|}{|A|+|B|-|A \cap B|}=\frac{A和B的交集}{A union B} J(A,B)=∣A∪B∣∣A∩B∣=∣A∣+∣B∣−∣A∩B∣∣A∩B∣=AunionBA和B的交集
J(A,B) 表示用户A和用户B之间的相似度。
公式很简单,我们先来看一下分子,A ∩ B表示用户A的购买记录和用户B的购买记录的交集。拿上面的数据举例,u1用户和u2用户的交集为:{a、b、d、e} ∩ {a、c} = {a}
之后来看一下分母,它的意思是A和B做union的结果(注意不是union all)。因此,拿u1用户和u2用户距离,此时union出来的结果为 {a、b、d、e} union {a、c} = {a、b、c、d、e}
因此我们可以得出
J ( u 1 , u 2 ) = { a } { a 、 b 、 c 、 d 、 e } = 1 5 = 0.2 J(u_1, u_2)=\frac{\{a\}}{\{a、b、c、d、e\}}=\frac{1}{5}=0.2 J(u1,u2)={a、b、c、d、e}{a}=51=0.2
之后继续计算u1和u3、u4之间的相似度:
J ( u 1 , u 3 ) = { a 、 b 、 d 、 e } ∩ { b 、 c 、 d } { a 、 b 、 d 、 e } u n i o n { b 、 c 、 d } = { b 、 d } { a 、 b 、 c 、 d 、 e } = 2 5 = 0.4 J(u_1, u_3)=\frac{\{a、b、d、e\}\cap\{b、c、d\}}{\{a、b、d、e\}union\{b、c、d\}}=\frac{\{b、d\}}{\{a、b、c、d、e\}}=\frac{2}{5}=0.4 J(u1,u3)={a、b、d、e}union{b、c、d}{a、b、d、e}∩{b、c、d}={a、b、c、d、e}{b、d}=52=0.4
J ( u 1 , u 4 ) = { a 、 b 、 d 、 e } ∩ { a 、 c 、 d 、 e } { a 、 b 、 d 、 e } u n i o n { a 、 c 、 d 、 e } = { a 、 d 、 e } { a 、 b 、 c 、 d 、 e } = 3 5 = 0.6 J(u_1, u_4)=\frac{\{a、b、d、e\}\cap\{a、c、d、e\}}{\{a、b、d、e\}union\{a、c、d、e\}}=\frac{\{a、d、e\}}{\{a、b、c、d、e\}}=\frac{3}{5}=0.6 J(u1,u4)={a、b、d、e}union{a、c、d、e}{a、b、d、e}∩{a、c、d、e}={a、b、c、d、e}{a、d、e}=53=0.6
因此从杰卡德相似系数可以看出,u1用户和u4用户是相似的。
余弦相似度是通过测量两个向量之间的夹角余弦值来衡量他们之间的相似程度。
如上图,A(1,2)和B(2,1)分别是两个向量,θ 是两个向量的夹角,cosθ 是夹角的余弦值。θ的取值范围是是[0,180度],对应的cosθ范围为[-1,1]
因此,cosθ的值越大,两个向量的相似度就越大
需要注意的是,余弦相似度关注的是向量的方向,因此向量的大小并不重要。比如下图:
向量(1,2)和向量(2,1)的相似度是cosθ,和向量(4,2)的相似度也是cosθ。
知道了余弦值如何表达相似度后,我们该计算两个向量之间的余弦值呢。
首先从余弦定理出发,高中时大家应该都有学过余弦定理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FM0SqtwS-1677574284171)(推荐系统-1.assets/image-20220928160004213.png)]
c 2 = a 2 + b 2 − 2 a b cos θ a 2 = b 2 + c 2 − 2 b c cos β b 2 = c 2 + a 2 − 2 c a cos α \begin{array}{l} c^{2}=a^{2}+b^{2}-2 a b \cos \theta \\ a^{2}=b^{2}+c^{2}-2 b c \cos \beta \\ b^{2}=c^{2}+a^{2}-2 c a \cos \alpha \end{array} c2=a2+b2−2abcosθa2=b2+c2−2bccosβb2=c2+a2−2cacosα
勾股定理是余弦定理的特殊情况,即α为90度时,cosα=0,此时
b 2 = a 2 + c 2 b^{2}=a^{2}+c^{2} b2=a2+c2
根据余弦定理,我们可以推出
cos θ = a 2 + b 2 − c 2 2 a b \cos \theta=\frac{a^2+b^2-c^2}{2ab} cosθ=2aba2+b2−c2
其中a、b、c三条边的大小我们通过两个向量A、B可以求出(A、B加上坐标轴原点构成了一个三角形)。
假设有向量A(x1,x2)和B(y1,y2),那么
a 2 = ( x 1 − 0 ) 2 + ( x 2 − 0 ) 2 = x 1 2 + x 2 2 b 2 = ( y 1 − 0 ) 2 + ( y 2 − 0 ) 2 = y 1 2 + y 2 2 c 2 = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 = x 1 2 − 2 ∗ x 1 y 1 + y 1 2 + x 2 2 − 2 ∗ x 2 y 2 + y 2 2 \begin{array}{l} a^{2}=(x_1-0)^{2}+(x_2-0)^{2}=x_1^2+x_2^2 \\ b^{2}=(y_1-0)^{2}+(y_2-0)^{2}=y_1^2+y_2^2 \\ c^{2}=(x_1-y_1)^{2}+(x_2-y_2)^{2}=x_1^{2}-2 * x_1 y_1+y_1^{2}+x_2^{2}-2 * x_2 y_2+y_2^{2} \end{array} a2=(x1−0)2+(x2−0)2=x12+x22b2=(y1−0)2+(y2−0)2=y12+y22c2=(x1−y1)2+(x2−y2)2=x12−2∗x1y1+y12+x22−2∗x2y2+y22
所以可得:
cos θ = x 1 2 + x 2 2 + y 1 2 + y 2 2 − x 1 2 + 2 ∗ x 1 y 1 − y 1 2 − x 2 2 + 2 ∗ x 2 y 2 − y 2 2 2 ( x 1 2 + x 2 2 ) ( y 1 2 + y 2 2 ) = x 1 y 1 + x 2 y 2 x 1 2 + x 2 2 × y 1 2 + y 2 2 \cos \theta=\frac{x_1^2+x_2^2+y_1^2+y_2^2-x_1^{2}+2 * x_1 y_1-y_1^{2}-x_2^{2}+2 * x_2 y_2-y_2^{2}}{2\sqrt{(x_1^2+x_2^2)} \sqrt{(y_1^2+y_2^2)} }=\frac{x_{1} y_{1}+x_{2} y_{2}}{\sqrt{x_{1}^{2}+x_{2}^{2}} \times \sqrt{y_{1}^{2}+y_{2}^{2}}} cosθ=2(x12+x22)(y12+y22)x12+x22+y12+y22−x12+2∗x1y1−y12−x22+2∗x2y2−y22=x12+x22×y12+y22x1y1+x2y2
数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,则A与B的夹角θ的余弦等于:
cos θ = ∑ i = 1 n ( A i × B i ) ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 = A ⋅ B ∣ A ∣ × ∣ B ∣ \begin{aligned} \cos \theta &=\frac{\sum_{i=1}^{n}\left(A_{i} \times B_{i}\right)}{\sqrt{\sum_{i=1}^{n}\left(A_{i}\right)^{2}} \times \sqrt{\sum_{i=1}^{n}\left(B_{i}\right)^{2}}} \\ &=\frac{A \cdot B}{|A| \times|B|} \end{aligned} cosθ=∑i=1n(Ai)2×∑i=1n(Bi)2∑i=1n(Ai×Bi)=∣A∣×∣B∣A⋅B
知道了余弦相似度如何计算后,我们该如何去计算用户之间的相似度呢,还是以这几个用户举例:
用户标识 | 购买物品列表 |
---|---|
u1 | a、b、d、e |
u2 | a、c |
u3 | b、c、d |
u4 | a、c、d、e |
余弦相似度只能计算两个向量之间的相似,而上面用户对应数据是一个物品列表,因此我们需要对其进行编码。
因为物品的总数量是5个,因此我们可以用一个5维的向量来表示。比如A[A1、A2、A3、A4、A5]的5个值分别对应a、b、c、d、e的购买行为,购买过则值为1,没购买过则为0。通过编码,我们可以得到各个用户对应的向量:
a | b | c | d | e | 最终编码(向量) | |
---|---|---|---|---|---|---|
u1 | 1 | 1 | 0 | 1 | 1 | (1,1,0,1,1) |
u2 | 1 | 0 | 1 | 0 | 0 | (1,0,1,0,0) |
u3 | 0 | 1 | 1 | 1 | 0 | (0,1,1,1,0) |
u4 | 1 | 0 | 1 | 1 | 1 | (1,0,1,1,1) |
之后使用余弦相似度计算u1和其他用户之间的相似度:
cos ( u 1 , u 2 ) = 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 0 1 ∗ 1 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 1 ∗ 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 0 ∗ 0 = 1 8 cos ( u 1 , u 3 ) = 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 1 + 1 ∗ 1 + 1 ∗ 0 1 ∗ 1 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 1 ∗ 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 1 + 1 ∗ 1 + 0 ∗ 0 = 2 12 = 1 3 cos ( u 1 , u 4 ) = 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 1 + 1 ∗ 1 1 ∗ 1 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 1 ∗ 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 1 + 1 ∗ 1 = 3 4 \begin{array}{l} \cos (u_1,u_2)=\frac{1*1+1*0+0*1+1*0+1*0}{\sqrt{1*1+1*1+0*0+1*1+1*1}*\sqrt{1*1+0*0+1*1+0*0+0*0}}=\frac{1}{\sqrt{8} }\\ \cos (u_1,u_3)=\frac{1*0+1*1+0*1+1*1+1*0}{\sqrt{1*1+1*1+0*0+1*1+1*1}*\sqrt{0*0+1*1+1*1+1*1+0*0}}=\frac{2}{\sqrt{12} }=\frac{1}{\sqrt{3} }\\ \cos (u_1,u_4)=\frac{1*1+1*0+0*1+1*1+1*1}{\sqrt{1*1+1*1+0*0+1*1+1*1}*\sqrt{1*1+0*0+1*1+1*1+1*1}}=\frac{3}{4} \end{array} cos(u1,u2)=1∗1+1∗1+0∗0+1∗1+1∗1∗1∗1+0∗0+1∗1+0∗0+0∗01∗1+1∗0+0∗1+1∗0+1∗0=81cos(u1,u3)=1∗1+1∗1+0∗0+1∗1+1∗1∗0∗0+1∗1+1∗1+1∗1+0∗01∗0+1∗1+0∗1+1∗1+1∗0=122=31cos(u1,u4)=1∗1+1∗1+0∗0+1∗1+1∗1∗1∗1+0∗0+1∗1+1∗1+1∗11∗1+1∗0+0∗1+1∗1+1∗1=43
通过余弦相似度公式我们可以算出,u4和u1的相似度是最大的。
Content-based Recommendations(CB)是推荐系统中最基础的算法,也是最古老的算法。它会根据用户过去喜欢的物品,为用户推荐和这个物品相似的物品。这个相似判断是通过抽取物品的内在或外在的特征值来实现的。
举个例子,对于一个电影来说,它的特征可能有[导演、演员、影片类型、时长、所属国家、用户打分、…]。基于这些特征,我们通过相似度算法计算出各个电影之间的相似度。
总得来说,基于内存的推荐算法很好理解,一共就分两步:
用户不会主动告诉我们他喜欢什么物品,因此我们需要根据用户的相关行为来构建用户画像信息。具体什么行为得根据不同的场景来判断。
基于内容的推荐第二步是找到和用户喜欢物品最相似的N个物品。
相似度算法之前已经介绍过了,但在使用相似度算法之前,我们需要确定物品有哪些特征。因此,如何挖掘物品的特征是基于内容的推荐算法中的核心问题。可以说,基于内容的推荐,最重要的不是推荐算法,而是内容挖掘和分析(也就是挖掘物品的特征/标签)。内容挖掘的越深,才能让推荐算法达到更好的效果。
对于物品的特征提取/标签挖掘,一般有几种办法:
当我们需要验证一个算法好坏的时候,需要进行一些实验。关于评测推荐效果的实验方法,一般有三种
这个可以说是机器学习领域中很通用的方法,它的优缺点如下:
离线实验虽然方便高效,但是离线实验出来的结果可能和实际效果有较大的出入。为了测试实际的效果,我们可以在上线前做一次小规模的用户测试调查,选择部分真实用户,在我们部署的测试环境中进行操作,完成一些任务,然后观察其行为,并问他们一些问题。通过分析他们的行为和答案来判断算法的效果。
在完成离线实验和必要的用户调查后,可以将算法上线做AB测试,将其和旧的算法进行比较。
AB测试是常用的在线评测算法的实验方法,它可以通过一定的规则将用户随机分成几组,对不同组的用户采用不同的算法,然后通过各种不同的评测指标来衡量哪种算法比较好。比如可以统计用户的点击率、停留时间等指标来评测效果算法好坏。
预测准确度是说一个推荐系统或者推荐算法预测用户行为的能力。它是推荐系统最重要的一个指标,从推荐系统诞生的那一天起, 几乎99%与推荐相关的论文都在讨论这个指标。这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。
在离线实现中,我们可以将数据集分为训练集和测试集,通过测试集来预测算法的准确度。不同的推荐场景对于准确度有不同的计算方法。主要的推荐场景一般有两种,分别是评分预测和TopN推荐。
很多提供推荐服务的网站都有一个让用户给物品打分的功能。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型, 并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
评分预测的预测准确度一般通过均方根误差 (RMSE) 和平均绝对误差 ( MAE ) 计算。rui表示用户u对物品i的实际评分,rui表示用户u对物品i的预测评分,T表示测试集的样本数量,那么
RMSE(均方根误差) = ∑ u , i ∈ T ( r u i − r ^ u i ) 2 ∣ T ∣ = ∑ u , i ∈ T ( 实际评分 − 预测评分 ) 2 ∣ 样本数量 ∣ \operatorname{RMSE(均方根误差)}=\sqrt{\frac{\sum_{u, i \in T}\left(r_{u i}-\hat{r}_{u i}\right)^{2}}{|T|} }=\sqrt{\frac{\sum_{u, i \in T}\left(实际评分-预测评分\right)^{2}}{|样本数量|} } RMSE(均方根误差)=∣T∣∑u,i∈T(rui−r^ui)2=∣样本数量∣∑u,i∈T(实际评分−预测评分)2
M A E ( 平均绝对误差 ) = ∑ u , i ∈ T ∣ r u i − r ^ u i ∣ ∣ T ∣ = ∑ u , i ∈ T ∣ 实际评分 − 预测评分 ∣ ∣ 样本数量 ∣ \mathrm{MAE(平均绝对误差)}=\frac{\sum_{u, i \in T}\left|r_{u i}-\hat{r}_{u i}\right|}{|T|}=\frac{\sum_{u, i \in T}\left|实际评分-预测评分\right|}{|样本数量|} MAE(平均绝对误差)=∣T∣∑u,i∈T∣rui−r^ui∣=∣样本数量∣∑u,i∈T∣实际评分−预测评分∣
RMSE与MAE对比:RMSE针对异常值更敏感(即有一个预测值与真实值相差很大,那么RMSE就会很大)。因此,使用RMSE来评测准确度就意味着对系统的评测更为苛刻。在实际情况中,我们可以同时用这两个指标,通过查看MAE和RMSE的比值找出那些存在较大但不常见的错误。
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。 TopN推荐的预测准确率一般通过准确率 ( precision ) /召回率 (recall ) 度量。
假设R(u)是算法给用户u的推荐列表,T(u)是用户u真实的行为列表。那么
Recall(召回率) = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ T ( u ) ∣ \text { Recall(召回率) }=\frac{\sum_{u \in U}|R(u) \bigcap T(u)|}{\sum_{u \in U}|T(u)|} Recall(召回率) =∑u∈U∣T(u)∣∑u∈U∣R(u)⋂T(u)∣
Precision(准确率) = ∑ u ∈ U ∣ R ( u ) ⋂ T ( u ) ∣ ∑ u ∈ U ∣ R ( u ) ∣ \text { Precision(准确率) }=\frac{\sum_{u \in U}|R(u) \bigcap T(u)|}{\sum_{u \in U}|R(u)|} Precision(准确率) =∑u∈U∣R(u)∣∑u∈U∣R(u)⋂T(u)∣
也就是说,假设我们给用户推荐了5个物品,用户自己消费了10个物品,而我们推荐的物品中只有一个和用户真实的列表一致,那么召回率就是1/10=10%,准确率就是1/5=20%。
评分预测一直是推荐系统研究的热点,这主要是因为推荐系统的早期研究组GroupLens的研究主要是基于电影评分数据MovieLens进行的,同时推荐系统的Netflix大赛也主要面向评分预测问题。
但有科学家指出,TopN预测更符合实际的应用场景。因为即使我们对用户的评分预测的非常准确,也不能表明它能为我们带来多少收益。
举个例子,在豆瓣上有许多冷门的高分电视剧或电影,这些电影都是高品质的,大部分人去看应该也会打高分。但是打高分并不意味着用户就感兴趣,如果我们因为预测用户对这些电影评分高而向他们推荐这些电影,那最后八成会被大部分用户忽视。
备注:
但是准确的预测并不代表好的推荐。
比如一个用户本来就要准备购买某书,那么无论是否给他推荐,他都准备购买,所以这个推荐结果显然是不好的,因为它未使用户购买更多的书。
用户作为推荐系统的重要参与者,用户的满意度也是最重要的指标之一。与预测准确度相比,用户满意度是个相对主观的指标,因此无法通过离线实验计算出来,只能通过在线实验和用户调查中获得。
在做用户调查时,我们可以根据发放问卷的形式来收集用户的满意度,拿GroupLens曾经做过的一个论文推荐系统的问卷来举例。该问卷是让用户选择哪句话是看到推荐内容结果后的感受:
这个问卷可以看出,设计满意度问卷时不能单单让用户回答是否满意,可能用户心里认为大体满意,但是对某些方面不满意,因而可能很难回答这个问题。需要设计问卷时需要充分考虑到用户各方面的感受,这样才能针对问题给出准确的回答。
在在线系统中,用户满意度用户的一些行为来统计得到。比如统计用户在对应物品上的点击率、用户停留时间和转化率等来手机用户的满意度。
覆盖率是描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义就是推荐出来的物品集合占总物品的比例。即:
覆盖率 = 推荐的物品数量 总物品数量 覆盖率=\frac{推荐的物品数量}{总物品数量} 覆盖率=总物品数量推荐的物品数量
再复杂些的系统就需要考虑上推荐列表中物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么说明该推荐系统的覆盖率高,发掘长尾的能力很好。
在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:
H = − ∑ i = 1 n p ( i ) log p ( i ) H=-\sum_{i=1}^{n} p(i) \log p(i) H=−i=1∑np(i)logp(i)
这里的p(i)是物品的流行度除以所有物品流行度之和。
第二个是基尼系数:
G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) G=\frac{1}{n-1} \sum_{j=1}^{n}(2 j-n-1) p\left(i_{j}\right) G=n−11j=1∑n(2j−n−1)p(ij)
推荐系统的初衷是消除马太效应,需要用基尼系数。。。。
用户的兴趣是广泛的,在视频网站中,一个用户既可能喜欢看《猫和老鼠》一类的动画片,也喜欢看成龙的动作片。因此,推荐列表最好能覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。
多样性保证了我们不会在一棵树上吊死。举个例子,某个用户对于电影的兴趣可能有很多,比如喜剧片、动作片、恐怖片。但是在某一时刻(比如他心情不好),只想看喜剧片,这时候多样性就保证了用户找到感兴趣电影的概率。而如果推进的列表品类单一,则用户找到感兴趣电影的概率就会降低。
多样性描述了推荐列表中物品的不相似程度,因此多样性和相似性是对应的。假设s(i,j)-[0,1]定义了物品i和物品j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
Diversity = 1 − ∑ i , j ∈ R ( u ) , i ≠ j s ( i , j ) 1 2 ∣ R ( u ) ∣ ( ∣ R ( u ) ∣ − 1 ) \text { Diversity }=1-\frac{\sum_{i, j \in R(u), i \neq j} s(i, j)}{\frac{1}{2}|R(u)|(|R(u)|-1)} Diversity =1−21∣R(u)∣(∣R(u)∣−1)∑i,j∈R(u),i=js(i,j)
推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
Diversity = 1 ∣ U ∣ ∑ u ∈ U Diversity ( R ( u ) ) \text { Diversity }=\frac{1}{|U|} \sum_{u \in U} \text { Diversity }(R(u)) Diversity =∣U∣1u∈U∑ Diversity (R(u))
关于推荐系统的多样性最好达到什么程度,我们可以通过一个简单的例子来了解一下。假设某个用户喜欢动作片和动画片,且用户80%的时间都在看动作片,20%的时间都在看动画片。那么,下面4种推荐列表:
可以看出,AB列表缺乏多样性,D列表过于多样,没有考虑到用户的主要兴趣。C列表是最好的,因为它考虑到了用户的主要兴趣,又具有一定的多样性。因此,多样性也需要根据用户的实际情况来调整。
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。推荐列表保证一定的新颖度可以更好的发掘用户的兴趣。评测新颖度的最简单方法就是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉的新颖。因此,如果推荐结果中物品的平均热门程度越低,那么推荐结果就可能有比较高的新颖度。
但是这个方法还是比较粗略的,因为不同用户不知道的东西是不同的,所以要准确的统计新颖度还需要做用户调查。
可能有同学会发现,要保证新颖度很可能会牺牲准确度。因此,如何不牺牲准确度的情况下,提高多样性和新颖度也是推荐系统近几年的一个研究方向。
惊喜度和新颖度有些相似,但也有一定区别。
举个例子,假设一个用户喜欢周星驰的电影,我们给他推荐了一部《临歧》的电影(1983年由刘德华、周星驰、梁朝伟合作演出,很少有人知道这部电影有周星驰出演),而该用户不知道这部电影,那可以说这个推荐具有新颖性,但是没有惊喜度,因为该用户一旦了解了这个电影的演员,就不会觉得特别奇怪。
如果我们给用户推荐了张艺谋导演的《红高粱》,假设用户没有看过这部电影,那么他看完这部电影后可能会觉的很奇怪,因为这部电影和他的兴趣一点关系也没有,但如果看完之后觉的很不错,那就可以说这个推荐是让用户惊喜的。
总的来说,惊喜度就是推荐和用户历史上喜欢的物品不想死,但用户却觉得很满意的推荐。
不过目前也没有什么公认的惊喜度指标定义的方式,虽然近几年学术界对惊喜度问题有了一定的关注,但是还没有太成熟的结果。
用户对推荐系统的信任度也是影响推荐好坏的一个非常重要的指标。
举个现实生活中的例子,你有2个朋友,一个非常靠谱,一个整天满嘴跑火车。那个靠谱的朋友推荐你去某个地方旅游时,你很可能听从他的建议。而那个满嘴跑火车的朋友的建议,你很可能就不会当回事。
提高推荐系统的信任度主要有两个方法:
实时性主要描述了时间因素对推荐效果带来的影响。
一种情况是物品本身具有时效性,比如一个新闻网站经常给用户推荐两三年前的新闻,那么这个网站无疑会失去大量用户。
还有一种情况,比如一个用户刚买了一部iphone,那么我们立刻给他推荐iphone相关配件肯定比第二天才给他推荐效果来的好。
任何一个能带来收益的系统都会被人攻击。这方面最为典型的例子就是搜索引擎。搜索引擎的作弊和反作弊斗争异常激烈,因为如果能让自己的商品成为热门搜索的第一个搜索结果,会带来极大的商业利益。推荐系统也有类似的问题,而健壮性指标则衡量了一个推荐系统抗击作弊的能力。
举个例子,亚马逊有一种推荐叫做"购买商品A的用户也经常购买的其他商品",它的主要计算方法是统计购买商品A的用户购买其他商品的次数。那么,我们可以很简单的攻击这个算法,让自己的商品在这个推荐列表中获得比较高的排名。比如可以注册很多账号,用这些账号同时购买商品A和自己的商品。
为了让系统的健壮性更高,我们要尽量在使用数据前过滤掉一些异常数据,同时尽量使用用户代价较高的用户行为。比如对比用户购买行为和用户浏览行为,购买行为需要付费,代价相对更高,而浏览行为很容易伪造,因此选择用户购买行为作为依据的算法会更健壮些。
上面介绍了很多指标,有些可以离线计算,有些只能在线获得。在实际的开发中,我们很难同时兼顾所有的指标。因此,如何有选择的放弃或降低一些指标来实现收益最大化也是推荐系统研究的重要问题。
比如我们的优化策略可以是保证覆盖率、多样性、新颖度达到一定值的情况下,尽可能的让预测准确度达到最大。
M a x ( 预测准确度 ) { 覆盖度 > A 多样性 > B 新颖度 > C \begin{array}{l} Max(预测准确度) \\ \left\{\begin{matrix} 覆盖度>A \\ 多样性>B \\ 新颖度>C \end{matrix}\right. \end{array} Max(预测准确度)⎩ ⎨ ⎧覆盖度>A多样性>B新颖度>C
其中A、B、C的具体取值可以根据实际情况进行调整。