【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例
前言
推荐系统的评价指标在不同类型的推荐场景下,选用的不同。有些推荐的评价指标并非完全出自推荐系统,而是从搜索算法,信息检索,机器学习等相关领域沿用过来,因此网上有些对评价指标的解释并非完全以推荐系统的角度进行,这让我会在学习的时候产生困惑,特此做出一些整理,力求完全用推荐系统的角度解释,并给出计算的具体流程。
目录
- 前言
- TopK 推荐评价指标
- TopK推荐
- Precision 精确度,Recall 召回率
- F1值
- 命中率(Hit Ratio,HR)
- 平均到数排名(Mean Reciprocal Rank,MRR)
- 平均精度均值(Mean Average Precision,MAP)
- 归一化折损累计增益(Normalized Discounted Cumulative Gain,NDCG)
- 样例
- 总结
如果你对本系列(未写完,持续更新中)感兴趣,可接以下传送门:
【推荐算法】从零开始做推荐(一)——认识数据
【推荐算法】从零开始做推荐(二)——推荐系统的评价指标,计算原理与实现样例
【推荐算法】从零开始做推荐(三)——传统矩阵分解的TopK推荐实战
【推荐算法】从零开始做推荐(四)——python Keras框架 利用Embedding实现矩阵分解TopK推荐
【推荐算法】从零开始做推荐(五)——贝叶斯个性化排序矩阵分解 (BPRMF) 推荐实战
【推荐算法】从零开始做推荐(六)——贝叶斯性化排序矩阵分解 (BPRMF) 的Tensorflow版
TopK 推荐评价指标
TopK推荐
定义:TopK推荐顾名思义,首先推荐给用户的项目数是K个,其次,这些推荐依据用户对项目的“评分”进行从高到低排序展示给用户。
举例:打开淘宝后给你推荐的TopK个商品;
特点:将推荐视为分类问题,如给定一个用户,其将要访问的项目作为其分类的标签,而对该用户的TopK推荐即为模型对该用户的多分类结果。
因此TopK推荐的评价指标也大多为分类问题指标沿用演化而来。
Precision 精确度,Recall 召回率
我最初了解它们,是出自机器学习分类问题里经典的混淆矩阵。网上有部分解释也是沿用混淆矩阵,但这会让我对于 T o p K TopK TopK推荐直观理解会造成困难,因此直接以推荐算法角度给出计算公式:
P r e c i s i o n @ K = ∑ i = 1 N ∣ R ( i ) ∩ T ( i ) ∣ ∑ i = 1 N ∣ R ( i ) ∣ … . … ( 1 ) R e c a l l @ K = ∑ i = 1 N ∣ R ( i ) ∩ T ( i ) ∣ ∑ i = 1 N ∣ T ( i ) ∣ … . … ( 2 ) \begin {aligned} Precision@K = \frac { \sum_{i=1}^N|R(i)∩T(i)|}{\sum_{i=1}^N|R(i)|} ….…(1)\\ Recall@K = \frac {\sum_{i=1}^N|R(i)∩T(i)|}{\sum_{i=1}^N|T(i)|}….…(2) \end{aligned} Precision@K=∑i=1N∣R(i)∣∑i=1N∣R(i)∩T(i)∣….…(1)Recall@K=∑i=1N∣T(i)∣∑i=1N∣R(i)∩T(i)∣….…(2)
下面对公式(1)(2)中的变量进行解释.
i i i:第 i i i次推荐。
R ( i ) R(i) R(i):第 i i i次推荐中,推荐的项目列表。
T ( i ) T(i) T(i):第 i i i次推荐中,用户真实访问的项目列表。
K K K: T o p K TopK TopK推荐中推荐列表的长度。
N N N:总推荐次数。
大多数场景下,对每一个用户进行一次 T o p K TopK TopK推荐,因此 n n n常为测试集中的用户, N N N常为测试集中的用户数量。
实际上, P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K的分子都是单次推荐时命中数量的累加,区别在分母, R e c a l l @ K Recall@K Recall@K的分母要按实际情况进行累加,但 P r e c i s i o n @ K Precision@K Precision@K的分母是推荐列表长度的累加,可以很轻松的得出: ∑ i = 1 N ∣ R ( i ) ∣ = N × K \sum_{i=1}^N|R(i)|=N×K ∑i=1N∣R(i)∣=N×K。
注意: P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K的计算都是先累加再相除,不能写成先相除再累加。
思考: P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K的值域在每次推荐都命中的情况下一定为1吗?这受 R ( i ) R(i) R(i)和 T ( i ) T(i) T(i)的长度影响。对每次推荐而言, ∣ R ( i ) ∣ = K |R(i)|=K ∣R(i)∣=K是定长的,而 ∣ T ( i ) ∣ |T(i)| ∣T(i)∣是变长的。
当任意的 ∣ T ( i ) ∣ |T(i)| ∣T(i)∣都小于 ∣ R ( i ) ∣ = K |R(i)|=K ∣R(i)∣=K时,有 m a x ( ∣ R ( i ) ∩ T ( i ) ∣ ) = ∣ T ( i ) ∣ , ∑ i = 1 N ∣ T ( i ) ∣ < ∑ i = 1 N ∣ R ( i ) ∣ max(|R(i)∩T(i)|)=|T(i)|, \sum_{i=1}^N|T(i)|<\sum_{i=1}^N|R(i)| max(∣R(i)∩T(i)∣)=∣T(i)∣,∑i=1N∣T(i)∣<∑i=1N∣R(i)∣,在每次都命中的前提下,:
P r e c i s i o n @ K = ∑ i = 1 N ∣ R ( i ) ∩ T ( i ) ∣ ∑ i = 1 N ∣ R ( i ) ∣ = ∑ i = 1 N ∣ T ( i ) ∣ ∑ i = 1 N ∣ R ( i ) ∣ < 1 R e c a l l @ K = ∑ i = 1 N ∣ R ( i ) ∩ T ( i ) ∣ ∑ i = 1 N ∣ T ( i ) ∣ = ∑ i = 1 N ∣ T ( i ) ∣ ∑ i = 1 N ∣ T ( i ) ∣ = 1 Precision@K = \frac { \sum_{i=1}^N|R(i)∩T(i)|}{\sum_{i=1}^N|R(i)|}= \frac { \sum_{i=1}^N|T(i)|}{\sum_{i=1}^N|R(i)|}<1\\Recall@K = \frac {\sum_{i=1}^N|R(i)∩T(i)|}{\sum_{i=1}^N|T(i)|}=\frac { \sum_{i=1}^N|T(i)|}{\sum_{i=1}^N|T(i)|}=1 Precision@K=∑i=1N∣R(i)∣∑i=1N∣R(i)∩T(i)∣=∑i=1N∣R(i)∣∑i=1N∣T(i)∣<1Recall@K=∑i=1N∣T(i)∣∑i=1N∣R(i)∩T(i)∣=∑i=1N∣T(i)∣∑i=1N∣T(i)∣=1。
同理,当任意的 ∣ T ( i ) ∣ |T(i)| ∣T(i)∣都大于 ∣ R ( i ) ∣ = K |R(i)|=K ∣R(i)∣=K时,在每次都命中的前提下,有 P r e c i s i o n @ K = 1 , R e c a l l @ K < 1 Precision@K =1,Recall@K <1 Precision@K=1,Recall@K<1,仅当任意的| ∣ T ( i ) ∣ |T(i)| ∣T(i)∣都等于 ∣ R ( i ) ∣ = K |R(i)|=K ∣R(i)∣=K时,在每次都命中的前提下, P r e c i s i o n @ K = 1 , R e c a l l @ K = 1 Precision@K =1,Recall@K =1 Precision@K=1,Recall@K=1。
疑惑:可以看出,要使 P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K达到1的条件是非常苛刻的,实际推荐场景中,很可能这两个指标的最大值都达不到1。那这会对其作为评价指标产生负面影响吗?欢迎各路大神与我交流。
F1值
有了 P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K, F 1 F1 F1值的计算也就顺水推舟地过来了,和机器学习中的公式完全一样。F1值是完全基于 P r e c i s i o n @ K Precision@K Precision@K和 R e c a l l @ K Recall@K Recall@K的,是一个综合考虑两者的评价指标,感兴趣的可以看这里。
F 1 @ K = 2 ∗ P r e c i s i o n @ K ∗ R e c a l l @ K P r e c i s i o n @ K + R e c a l l @ K … . … ( 3 ) F1@K=\frac{2*Precision@K*Recall@K}{Precision@K+Recall@K}….…(3) F1@K=Precision@K+Recall@K2∗Precision@K∗Recall@K….…(3)
命中率(Hit Ratio,HR)
听名字很好理解,但实际上概念很容易搞混。刚好看到一篇文章(TKDE-2019)有用命中率,这里以它的计算方法为准。
可以看出他这里分子是推荐命中的用户数,分母的是测试集中用户数,其对每一个用户推荐一次,因此准确而言分母应为推荐次数。
h r ( i ) = { 1 , R ( i ) ∩ T ( i ) ≠ ∅ 0 , R ( i ) ∩ T ( i ) = ∅ … . … ( 4 ) H R @ K = ∑ i = 1 N h r ( i ) N … . … ( 5 ) hr(i)=\left\{ \begin{array}{rcl} 1 & ,R(i)∩T(i)\not=\varnothing\\ 0 &, R(i)∩T(i)=\varnothing \end{array} \right.….…(4)\\ HR@K=\frac {\sum_{i=1}^Nhr(i)}{N}….…(5) hr(i)={10,R(i)∩T(i)=∅,R(i)∩T(i)=∅….…(4)HR@K=N∑i=1Nhr(i)….…(5)
可以看出, H R @ K HR@K HR@K与 R e c a l l @ K Recall@K Recall@K的计算思路有些相似,实际上, H R @ K HR@K HR@K也是衡量召回关系的指标。个人感觉 H R @ K HR@K HR@K的计算方式目前仍是模糊的,甚至部分博客将 H R @ K HR@K HR@K写成 R e c a l l @ K Recall@K Recall@K的计算方式,因此不是很建议使用。
平均到数排名(Mean Reciprocal Rank,MRR)
源自搜索领域,其中Reciprocal Rank(RR)指第一个正确答案在TopK推荐列表里的排名的倒数。MRR即为多次推荐RR的平均值。
M R R @ K = 1 N ∑ i = 1 N 1 r a n k ( i ) … . … ( 6 ) MRR@K=\frac1N\sum_{i=1}^N\frac{1}{rank(i)}….…(6) MRR@K=N1i=1∑Nrank(i)1….…(6)
其中 r a n k ( i ) rank(i) rank(i)表示第 i i i次推荐中,第一个命中的项目,在TopK推荐列表里的次序,若没命中,则 r a n k ( i ) → ∞ rank(i)\rightarrow∞ rank(i)→∞,即 1 r a n k ( i ) = 0 \frac{1}{rank(i)}=0 rank(i)1=0。
平均精度均值(Mean Average Precision,MAP)
同样,我们首先得知道Average Precision(AP)怎么计算(自己总结的,慎用):
A P ( i ) = { ∑ j = 1 ∣ h i t s i ∣ j r a n k ( h i t s i ( j ) ) ∣ T ( i ) ∣ , ∣ h i t s i ∣ ≠ 0 0 , ∣ h i t s i ∣ = 0 … . … ( 7 ) AP(i)=\left\{ \begin{array}{rcl} \frac{\sum_{j=1}^{|hits_i|}\frac{j}{rank(hits_i(j))}}{|T(i)|} & ,|hits_i|\not=0\\ 0 &, |hits_i|=0 \end{array} \right.….…(7) AP(i)={∣T(i)∣∑j=1∣hitsi∣rank(hitsi(j))j0,∣hitsi∣=0,∣hitsi∣=0….…(7)
其中 ∣ h i t s i ∣ |{hits}_i| ∣hitsi∣表示第 i i i次推荐中,命中的项目个数; h i t s i ( j ) hits_i(j) hitsi(j)表示在第 i i i次推荐中命中的第 j j j个项目; r a n k ( i t e m ) rank(item) rank(item)表示 i t e m item item在 R ( i ) R(i) R(i)中的位置。
M A P @ K MAP@K MAP@K即为 A P AP AP的平均值,其中 N N N同样为总推荐次数:
M A P @ K = 1 N ∑ i = 1 N A P ( i ) … . … ( 8 ) \negthinspace MAP@K=\frac1N\sum_{i=1}^NAP(i)….…(8) MAP@K=N1i=1∑NAP(i)….…(8)
归一化折损累计增益(Normalized Discounted Cumulative Gain,NDCG)
这个指标我最在博客上看到的都是关于评分推荐上的,而非TopK推荐,同样还是看到的那篇论文,刚好摆了出来,于是在此我也想记录下来。
可仔细一检查公式,发现文中的公式似乎是错误的,当一次推荐命中多个时,该公式只计算了一次,因此猜想是少了个sigma求和。
想完全照抄显然是不行了,只能再百度各路NDCG计算方法,从头开始讲起。NDCG的完全概念和计算方法可参照这里。下面根据评分类型的NDCG尝试推导TopK类型的NDCG。
先摆出按本文定义的变量,CG,DCG,IDCG的原计算公式。
CG(Cummulative Gain)表示累积增益;
DCG(Discounted Cummulative Gain), “Discounted”有打折,折扣的意思,这里指的是对于排名靠后推荐结果的推荐效果进行“打折处理”;
IDCG表示推荐系统某一用户返回的最好推荐结果列表, 即假设返回结果按照相关性排序, 最相关的结果放在最前面;
C G = ∑ j = 1 K r e l j D C G i = ∑ j = 1 K 2 r e l j − 1 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) N D C G i = D C G i I D C G i N D C G @ K = 1 N ∑ i = 1 N N D C G i CG=\sum_{j=1}^Krel_j\\ DCG_i=\sum_{j=1}^K\frac{2^{rel_j}-1}{log_2(rank(hits_i(j))+1)}\\ NDCG_i=\frac{DCG_i}{IDCG_i}\\ NDCG@K=\frac1N\sum_{i=1}^NNDCG_i CG=j=1∑KreljDCGi=j=1∑Klog2(rank(hitsi(j))+1)2relj−1NDCGi=IDCGiDCGiNDCG@K=N1i=1∑NNDCGi
h i t s i ( j ) 表 示 第 i 次 推 荐 命 中 的 第 j 个 项 目 ; hits_i(j)表示第i次推荐命中的第j个项目; hitsi(j)表示第i次推荐命中的第j个项目;
r a n k ( i t e m ) 表 示 i t e m 在 R ( i ) 中 的 位 置 ( 从 1 开 始 编 号 ) 。 rank(item)表示item在R(i)中的位置(从1开始编号)。 rank(item)表示item在R(i)中的位置(从1开始编号)。
以下为个人推算,不保证正确性,欢迎讨论!!!
之所以说在评分推荐系统里常用NDCG,是因为这个 r e l rel rel表示相关性,指的就是项目与用户的相关性,也就是评分。现在挪到TopK里,那命中了就是相关,未命中就应该是无关,若未命中时,设 r a n k ( h i t s i ( j ) ) → + ∞ rank(hits_i(j))\rightarrow+∞ rank(hitsi(j))→+∞,此时 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) → + ∞ , 1 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) → 0 log_2{(rank(hits_i(j))+1)}\rightarrow+∞,\frac{1}{log_2{(rank(hits_i(j))+1)}}\rightarrow0 log2(rank(hitsi(j))+1)→+∞,log2(rank(hitsi(j))+1)1→0,则DCG可改写成:
D C G i = ∑ j = 1 ∣ h i t s i ∣ 2 1 − 1 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) = ∑ j = 1 ∣ h i t s i ∣ 1 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) DCG_i=\sum_{j=1}^{|hits_i|}\frac{2^{1}-1}{log_2(rank(hits_i(j))+1)}=\sum_{j=1}^{|hits_i|}\frac{1}{log_2(rank(hits_i(j))+1)} DCGi=j=1∑∣hitsi∣log2(rank(hitsi(j))+1)21−1=j=1∑∣hitsi∣log2(rank(hitsi(j))+1)1
那么问题来了, I D C G i IDCG_i IDCGi怎么求?按照原理, I D C G i IDCG_i IDCGi即为最优的排序,则命中的全要在前面,若10个里面命中五个,则序号应为12345。则有如下公式:
I D C G i = ∑ j = 1 ∣ h i t s i ∣ 1 l o g 2 ( j + 1 ) IDCG_i=\sum_{j=1}^{|hits_i|}\frac{1}{log_2(j+1)} IDCGi=j=1∑∣hitsi∣log2(j+1)1
照着原公式进行推导,则有:
N D C G @ K = 1 N ∑ i = 1 N N D C G i = N D C G @ K = 1 N ∑ i = 1 N D C G i I D C G i = 1 N ∑ i = 1 N ∑ j = 1 ∣ h i t s i ∣ 1 l o g 2 ( r a n k ( h i t s i ( j ) ) + 1 ) ∑ j = 1 ∣ h i t s i ∣ 1 l o g 2 ( j + 1 ) NDCG@K=\frac1N\sum_{i=1}^NNDCG_i=NDCG@K=\frac1N\sum_{i=1}^N\frac{DCG_i}{IDCG_i}=\frac1N\sum_{i=1}^N\frac{\sum_{j=1}^{|hits_i|}\frac{1}{log_2(rank(hits_i(j))+1)}}{\sum_{j=1}^{|hits_i|}\frac{1}{log_2(j+1)}} NDCG@K=N1i=1∑NNDCGi=NDCG@K=N1i=1∑NIDCGiDCGi=N1i=1∑N∑j=1∣hitsi∣log2(j+1)1∑j=1∣hitsi∣log2(rank(hitsi(j))+1)1
可以发现,TKDE那篇文中似乎并没有计算IDCG,不知道这里面有什么说法没。
样例
假设在给用户推荐的场景中,总共对3个用户进行了 T o p @ 5 Top@5 Top@5推荐,情况分别如下:
R = [ [ 2 , 5 , 1 , 3 , 9 ] , [ 6 , 2 , 0 , 12 , 8 ] , [ 1 , 6 , 7 , 11 , 2 ] ] R=[[2,5,1,3,9],[6,2,0,12,8],[1,6,7,11,2]] R=[[2,5,1,3,9],[6,2,0,12,8],[1,6,7,11,2]]
T = [ [ 3 , 10 , 7 , 21 ] , [ 15 , 0 , 5 , 2 , 13 ] , [ 19 ] ] T=[[3,10,7,21],[15,0,5,2,13],[19]] T=[[3,10,7,21],[15,0,5,2,13],[19]]
则相应的指标计算如下:
P r e c i s i o n @ 5 = 1 + 2 + 0 5 + 5 + 5 = 3 15 = 0.2 Precision@5 =\frac{1+2+0}{5+5+5}=\frac{3}{15}=0.2 Precision@5=5+5+51+2+0=153=0.2
R e c a l l @ 5 = 1 + 2 + 0 4 + 5 + 1 = 3 10 = 0.3 Recall@5=\frac{1+2+0}{4+5+1}=\frac{3}{10}=0.3 Recall@5=4+5+11+2+0=103=0.3
F 1 @ 5 = 2 ∗ 0.2 ∗ 0.3 0.2 + 0.3 = 0.12 0.5 = 0.24 F1@5=\frac{2*0.2*0.3}{0.2+0.3}=\frac{0.12}{0.5}=0.24 F1@5=0.2+0.32∗0.2∗0.3=0.50.12=0.24
H R @ 5 = 1 + 1 + 0 3 = 2 3 ≈ 0.667 HR@5=\frac{1+1+0}{3}=\frac{2}{3}\approx0.667 HR@5=31+1+0=32≈0.667
M R R @ 5 = 1 4 + 1 2 + 0 3 = 1 4 = 0.25 MRR@5=\frac{\frac14+\frac12+0}{3}=\frac{1}{4}=0.25 MRR@5=341+21+0=41=0.25
M A P @ 5 = 1 4 4 + 1 2 + 2 3 5 + 0 1 3 = 71 720 ≈ 0.09861 MAP@5=\frac{\frac{\frac14}{4}+\frac{\frac12+\frac23}{5}+\frac01}{3}=\frac{71}{720}\approx0.09861 MAP@5=3441+521+32+10=72071≈0.09861
N D C G @ 5 = 1 3 ∗ ( 1 l o g 2 ( 4 + 1 ) 1 l o g 2 ( 1 + 1 ) + 1 l o g 2 ( 2 + 1 ) + 1 l o g 2 ( 3 + 1 ) 1 l o g 2 ( 1 + 1 ) + 1 l o g 2 ( 2 + 1 ) + 0 ) = 1 3 ∗ ( l o g 2 2 l o g 2 5 + l o g 2 3 + 2 2 ∗ ( 1 + l o g 2 3 ) + 0 ) ≈ 0.37470 NDCG@5=\frac{1}{3}*(\frac{\frac{1}{log_2{(4+1)}}{}}{\frac{1}{log_2{(1+1)}}}+\frac{\frac{1}{log_2{(2+1)}}+\frac{1}{log_2{(3+1)}}}{\frac{1}{log_2{(1+1)}}+\frac{1}{log_2{(2+1)}}}+0)=\frac13*(\frac{log_22}{log_25}+\frac{log_23+2}{2*(1+log_23)}+0)\approx0.37470 NDCG@5=31∗(log2(1+1)1log2(4+1)1+log2(1+1)1+log2(2+1)1log2(2+1)1+log2(3+1)1+0)=31∗(log25log22+2∗(1+log23)log23+2+0)≈0.37470
用代码也写了个,当作验算,效果如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 25 18:40:33 2020@author: Yang Lechuan
"""
import math
R=[[2,5,1,3,9],[6,2,0,12,8],[1,6,7,11,2]] #推荐列表
T=[[3,10,7,21],[15,0,5,2,13],[19]] #真实列表def cal_indicators(rankedlist, testlist):HITS_i = 0sum_precs = 0AP_i = 0 len_R = 0 len_T = 0MRR_i = 0 HR_i = 0DCG_i = 0IDCG_i = 0NDCG_i = 0ranked_score = []for n in range(len(rankedlist)):if rankedlist[n] in testlist:HITS_i += 1sum_precs += HITS_i / (n + 1.0)IDCG_i += 1.0/math.log2((HITS_i)+1)DCG_i += 1.0/math.log2((rankedlist.index(rankedlist[n])+1)+1)if MRR_i == 0:MRR_i = 1.0/(rankedlist.index(rankedlist[n])+1)else:ranked_score.append(0)if HITS_i > 0:AP_i = sum_precs/len(testlist)HR_i = 1NDCG_i = DCG_i/IDCG_ilen_R = len(rankedlist)len_T = len(testlist)return AP_i,len_R,len_T,MRR_i,HITS_i,HR_i,NDCG_iAP = 0
PRE = 0
REC = 0
MRR = 0
HITS = 0
HR = 0
sum_R = 0
sum_T = 0
F1 = 0
NDCG = 0
N = len(R) #推荐次数
K = len(R[0]) #每次推荐的项目个数
for i in range(N):AP_i,len_R,len_T,MRR_i,HITS_i,HR_i,NDCG_i = cal_indicators(R[i],T[i])AP += AP_isum_R += len_Rsum_T += len_TMRR += MRR_iHITS += HITS_iHR += HR_i NDCG += NDCG_i
PRE = HITS/(sum_R*1.0)
REC = HITS/(sum_T*1.0)
F1 = 2*PRE*REC/(PRE+REC)
HR = HR/(N*1.0)MRR = MRR/(N*1.0)
MAP = AP/(N*1.0)
NDCG = NDCG/(N*1.0)
print('评价指标如下:')
print('PRE@',K,':',PRE)
print('REC@',K,':',REC)
print('F1@',K,':',F1)
print('HR@',K,':',HR)print('MRR@',K,':',MRR)
print('MAP@',K,':',MAP)
print('NDCG@',K,':',NDCG)
可以看出和手算的一致。
总结
在TopK推荐中,本文共总结了7种指标,实际上这些指标可以分为两类,第一类指标关心用户想要的,我有没有推荐到,强调语文里的“准确性”,分别为 P r e c i s i o n @ K 、 R e c a l l @ K 、 F 1 @ K 、 H R @ K Precision@K、Recall@K、F1@K、HR@K Precision@K、Recall@K、F1@K、HR@K,第二类指标更关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性”,分别为 M R R @ K 、 M A P @ K 、 N D C G @ K MRR@K、MAP@K、NDCG@K MRR@K、MAP@K、NDCG@K。
实际上推荐系统里还有一些评价指标,从评分预测的角度的RMSE,衡量多样性的ILS等,这些指标并非在TopK推荐里应用,就不一一细讲了。在下一章,将进行传统矩阵分解的实战。
【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例相关推荐
- 推荐算法(2):基于内容的推荐
推荐算法(1):协同过滤总结 推荐算法(2):基于内容的推荐 推荐算法(3):利用用户标签数据 推荐算法(4)利用上下文信息 推荐算法(5)利用社交网络数据 推荐算法(6) 实例 推荐算法(7)缺失的 ...
- 基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐、基于项目推荐、基于SlopeOne算法推荐、基于SVD算法推荐、混合加权推荐)
基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐.基于项目推荐.基于SlopeOne算法推荐.基于SVD算法推荐.加权混合推荐) 一.开发工具及使用技术 MyEclipse10.jdk1. ...
- 在线新闻推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法、机器学习、分布式大数据、人工智
在线新闻推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法.机器学习.分布式大数据.人工智 ...
- Python+Django+Mysql简单在线课程推荐系统 基于用户、项目、内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载
Python+Django+Mysql简单在线课程推荐系统 基于用户.项目.内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载 ...
- Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户、项目、内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载
Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户.项目.内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载 一. ...
- 个性化推荐算法实战第01章个性化推荐算法综述
文章目录 个性化推荐算法实战第01章个性化推荐算法综述 1.什么是推荐系统? 2.个性化推荐算法在系统中所起到的作用 3.如何衡量个性化推荐算法在产品中起到的作用 4.推荐算法介绍 5.评估指标: 个 ...
- python电影推荐算法_基于Python的电影推荐算法
原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...
- 【推荐算法】知识驱动的智能化推荐算法(附交流视频和PPT下载链接)
今天给大家带来中国人民大学赵鑫老师在2020年5月10日举办的"推荐系统前沿进展"系列学术沙龙活动中所做的分享<知识驱动的智能化推荐算法研究进展汇报>,在本次分享中,赵 ...
- 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法
协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...
最新文章
- 中小学AI教育靠谱吗?50%教师教学经验不足1年
- Fedora 下安装Mplayer(添加源和解决错误问题)
- Linux-unit12
- python json.loads()中文问题-Python实现的json文件读取及中文乱码显示问题解决方法...
- 操作系统:基于页面置换算法的缓存原理详解(上)
- SD--关于销售环节的折扣、折让、回扣、佣金的介绍
- tensorflow随笔-非线性回归
- ITK:将RGB图像转换为灰度图像
- Python代码打包成exe文件
- R语言学习——处理数据对象的实用函数
- cks32和stm32_cks子,间谍,局部Mo子和短管
- mysql创建表时出现1071_mysql 出现1071错误怎么办
- 产品经理如何晋升为产品总监
- webpack的sourcemap
- python数组拼接concat_【JavaScript】重写数组的concat()方法
- 各种数据库默认端口汇集
- 详细领略Java的输入流和输出流
- 国务院关于取消一批职业资格许可和认定事项的决定国发〔2016〕5号
- iOS屏幕旋转与锁屏
- 尺度不变特征变换(SIFT算法…
热门文章
- 如何在 Linux 系统启用 UEFI 的 Secure Boot
- java ee小程序_JAVA EE社团管理升级版-微信小程序端说明文档
- 【Java工具类】(22)—服务器传文件工具类SCp和Sftp
- 2018 Android面试心得,已拿到offer,android进程管理器
- xfce桌面截图及快捷键
- 扩展坞可以把手机投到显示器吗_为什么好多手机不能通过Type-C扩展接投影以及显示器等?比如荣耀V10?...
- zbrush 使用dynamic mesh zremesh 进行快速拓扑
- web黑盒邮箱临界值验证
- 放大招----软件管理信息列表
- ApkTool 反编译Android apk (加固逆向)