前言

  推荐系统的评价指标在不同类型的推荐场景下,选用的不同。有些推荐的评价指标并非完全出自推荐系统,而是从搜索算法,信息检索,机器学习等相关领域沿用过来,因此网上有些对评价指标的解释并非完全以推荐系统的角度进行,这让我会在学习的时候产生困惑,特此做出一些整理,力求完全用推荐系统的角度解释,并给出计算的具体流程。

目录

  • 前言
  • 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=1NR(i)i=1NR(i)T(i).(1)Recall@K=i=1NT(i)i=1NR(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 KT 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@KR 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=1NR(i)=N×K
  注意P r e c i s i o n @ K Precision@K Precision@KR e c a l l @ K Recall@K Recall@K的计算都是先累加再相除,不能写成先相除再累加。
  思考P r e c i s i o n @ K Precision@K Precision@KR 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=1NT(i)<i=1NR(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=1NR(i)i=1NR(i)T(i)=i=1NR(i)i=1NT(i)<1Recall@K=i=1NT(i)i=1NR(i)T(i)=i=1NT(i)i=1NT(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@KR 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@KR e c a l l @ K Recall@K Recall@KF 1 F1 F1值的计算也就顺水推舟地过来了,和机器学习中的公式完全一样。F1值是完全基于 P r e c i s i o n @ K Precision@K Precision@KR 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@K2Precision@KRecall@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=Ni=1Nhr(i).(5)
  可以看出, H R @ K HR@K HR@KR 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=1Nrank(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=1hitsirank(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 itemR ( 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=1NAP(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=1KreljDCGi=j=1Klog2(rank(hitsi(j))+1)2relj1NDCGi=IDCGiDCGiNDCG@K=N1i=1NNDCGi

   h i t s i ( j ) 表 示 第 i 次 推 荐 命 中 的 第 j 个 项 目 ; hits_i(j)表示第i次推荐命中的第j个项目; hitsi(j)ij
   r a n k ( i t e m ) 表 示 i t e m 在 R ( i ) 中 的 位 置 ( 从 1 开 始 编 号 ) 。 rank(item)表示item在R(i)中的位置(从1开始编号)。 rank(item)itemR(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)10,则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=1hitsilog2(rank(hitsi(j))+1)211=j=1hitsilog2(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=1hitsilog2(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=1NNDCGi=NDCG@K=N1i=1NIDCGiDCGi=N1i=1Nj=1hitsilog2(j+1)1j=1hitsilog2(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.320.20.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=320.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=720710.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@KRecall@KF1@KHR@K,第二类指标更关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性”,分别为 M R R @ K 、 M A P @ K 、 N D C G @ K MRR@K、MAP@K、NDCG@K MRR@KMAP@KNDCG@K
  实际上推荐系统里还有一些评价指标,从评分预测的角度的RMSE,衡量多样性的ILS等,这些指标并非在TopK推荐里应用,就不一一细讲了。在下一章,将进行传统矩阵分解的实战。

【推荐算法】从零开始做推荐(二)——TopK推荐的评价指标,计算原理与样例相关推荐

  1. 推荐算法(2):基于内容的推荐

    推荐算法(1):协同过滤总结 推荐算法(2):基于内容的推荐 推荐算法(3):利用用户标签数据 推荐算法(4)利用上下文信息 推荐算法(5)利用社交网络数据 推荐算法(6) 实例 推荐算法(7)缺失的 ...

  2. 基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐、基于项目推荐、基于SlopeOne算法推荐、基于SVD算法推荐、混合加权推荐)

    基于音乐/电影/图书的协同过滤推荐算法代码实现(基于用户推荐.基于项目推荐.基于SlopeOne算法推荐.基于SVD算法推荐.加权混合推荐) 一.开发工具及使用技术 MyEclipse10.jdk1. ...

  3. 在线新闻推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法、机器学习、分布式大数据、人工智

    在线新闻推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法.机器学习.分布式大数据.人工智 ...

  4. Python+Django+Mysql简单在线课程推荐系统 基于用户、项目、内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载

    Python+Django+Mysql简单在线课程推荐系统 基于用户.项目.内容的协同过滤推荐算法 SimpleOnlineCourseCFRSPyth python实现协同过滤推荐算法实现源代码下载 ...

  5. Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户、项目、内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载

    Python+Django+Mysql个性化二手车推荐系统 汽车推荐系统 基于用户.项目.内容的协同过滤推荐算法 WebCarCFRSPython python实现协同过滤推荐算法实现源代码下载 一. ...

  6. 个性化推荐算法实战第01章个性化推荐算法综述

    文章目录 个性化推荐算法实战第01章个性化推荐算法综述 1.什么是推荐系统? 2.个性化推荐算法在系统中所起到的作用 3.如何衡量个性化推荐算法在产品中起到的作用 4.推荐算法介绍 5.评估指标: 个 ...

  7. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  8. 【推荐算法】知识驱动的智能化推荐算法(附交流视频和PPT下载链接)

    今天给大家带来中国人民大学赵鑫老师在2020年5月10日举办的"推荐系统前沿进展"系列学术沙龙活动中所做的分享<知识驱动的智能化推荐算法研究进展汇报>,在本次分享中,赵 ...

  9. 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法

    协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...

最新文章

  1. 中小学AI教育靠谱吗?50%教师教学经验不足1年
  2. Fedora 下安装Mplayer(添加源和解决错误问题)
  3. Linux-unit12
  4. python json.loads()中文问题-Python实现的json文件读取及中文乱码显示问题解决方法...
  5. 操作系统:基于页面置换算法的缓存原理详解(上)
  6. SD--关于销售环节的折扣、折让、回扣、佣金的介绍
  7. tensorflow随笔-非线性回归
  8. ITK:将RGB图像转换为灰度图像
  9. Python代码打包成exe文件
  10. R语言学习——处理数据对象的实用函数
  11. cks32和stm32_cks子,间谍,局部Mo子和短管
  12. mysql创建表时出现1071_mysql 出现1071错误怎么办
  13. 产品经理如何晋升为产品总监
  14. webpack的sourcemap
  15. python数组拼接concat_【JavaScript】重写数组的concat()方法
  16. 各种数据库默认端口汇集
  17. 详细领略Java的输入流和输出流
  18. 国务院关于取消一批职业资格许可和认定事项的决定国发〔2016〕5号
  19. iOS屏幕旋转与锁屏
  20. 尺度不变特征变换(SIFT算法…

热门文章

  1. 如何在 Linux 系统启用 UEFI 的 Secure Boot
  2. java ee小程序_JAVA EE社团管理升级版-微信小程序端说明文档
  3. 【Java工具类】(22)—服务器传文件工具类SCp和Sftp
  4. 2018 Android面试心得,已拿到offer,android进程管理器
  5. xfce桌面截图及快捷键
  6. 扩展坞可以把手机投到显示器吗_为什么好多手机不能通过Type-C扩展接投影以及显示器等?比如荣耀V10?...
  7. zbrush 使用dynamic mesh zremesh 进行快速拓扑
  8. web黑盒邮箱临界值验证
  9. 放大招----软件管理信息列表
  10. ApkTool 反编译Android apk (加固逆向)