符号说明

\(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序

$pos$: 当前用户实际点击过的items

\(N\): 测试用户数量

示例数据

N = 4

| len(top_k & pos) | len(pos) | 预测中(四声)的item在top_k中的位置(1为预测中,长度为用户实际点击过的items长度)

| ---- | ---- | ---- |

| 1 | 2 | 1 0

| 2 | 3 | 0 1 1

| 3 | 4 | 1 0 1 1

| 0 | 3 | 0 0 0

一、Hit Rate

网上有2种定义方式,不知道哪个更为正确的,有知道的人能不能麻烦告诉我一下?

第一种

对所有用户:我们真正喜欢的物品中,你给我们推荐了多少

hit = 0
total = 0
for i in users:
top_k = 获取top_k的代码
hit += len(top_k & pos)
total += len(pos) hit_rate = hit / total

\(hit\_rate = \frac{1 + 2 + 3 + 0}{2 + 3 + 4 + 5}\)

第二种

被推荐到喜欢物品的用户占总用户的比例

hit = 0
for i in users:
top_k = 获取top_k的代码
if top_k中有预测到pos中的item:
hit += 1
hit_rate = hit / N

\(hit\_rate = \frac{1 + 1 + 1 + 0}{4}\)

二、Recall

对某个用户:我真正喜欢的物品中,你给我推荐了多少

recall = 0
for i in users:
top_k = xxx(i)
recall += len(top_k & pos) / len(pos) # 用户i的recall
recall = mean(recall)

\(recall = (\frac{1}{2} + \frac{2}{3} + \frac{3}{4} + \frac{0}{3})\ /\ 4\)

三、NDCG

对某个用户:实际的折扣累计收益 DCG (Discounted Cumulative Gain) / 理想的DCG

DCG:考虑位置因素,希望用户喜欢的物品在top_k中排得越前越好

iDCG:归一化,解决【不同用户的DCG求和项数不同,不能进行比较】的问题

NDCG = 0
for i in users:
DCG = 0
iDCG = 0
top_k = xxx(i)
for rank in range(k):
if top_k[rank] in pos:
DCG += 1 / log2(rank + 2)
for i in range(min(k, len(pos))):
iDCG += 1 / log2(i + 2)
NDCG_u = DCG / iDCG
NDCG += NDCG_u
NDCG = mean(NDCG)

推荐系统 TOP K 评价指标的更多相关文章

  1. [LeetCode] Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  2. Leetcode 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  3. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  4. LeetCode "Top K Frequent Elements"

    A typical solution is heap based - "top K". Complexity is O(nlgk). typedef pair<int, un ...

  5. [IR] Ranking - top k

    PageRanking 通过: Input degree of link "Flow" model - 流量判断喜好度 传统的方式又是什么呢? Every term在某个doc中的 ...

  6. 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  7. 面试题:m个长度为n的ordered array,求top k 个 数字

    package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...

  8. get top k elements of the same key in hive

    key points: 1. group by key and sort by using distribute by and sort by. 2. get top k elements by a ...

  9. Top k问题(线性时间选择算法)

    问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...

随机推荐

  1. 不想业务被中断?快来解锁华为云RDS for MySQL新特性

    摘要:新特性上线!华为云RDS for MySQL又添新技能,实力保障业务连续性. 本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:Gauss ...

  2. 用 Java 写一个单例类?

    饿汉式单例 public class Singleton { private Singleton(){} private static Singleton instance = new Singlet ...

  3. memcached 的多线程是什么?如何使用它们?

    线程就是定律(threads rule)!在 Steven Grimm 和 Facebook 的努力下, memcached 1.2 及更高版本拥有了多线程模式.多线程模式允许 memcached 能 ...

  4. java后台解决上传图片翻转90的问题,有demo,经过测试可用

    1.需要加入 依赖 metadata-extractor.jar 依赖如下 <dependencies> <!-- Extracts Exif, IPTC, XMP, ICC and ...

  5. centos简单命令备忘

    1.查看当前目录 [root@instance-aif30iaj bin]# df -h 2.查看指定目录 在命令后直接放目录名,比如查看"usr"目录使用情况: [root@in ...

  6. String工具类之“前缀比较”StringUtils.startsWith和StringUtils.startsWithIgnoreCase

    (1)字符串以prefix为前缀(区分大小写) StringUtils.startsWith(被比较的字符串,比较字符串) 总结: 根据下面代码发现,上面的例子有部分时错误的,有可能是因为思维原因,他 ...

  7. ubuntu+ROS安装turtulebot3

    0 简介 Turtlebot是一种室内移动机器人,搭载激光传感器,使机器有精确的距离感知能力.通过搭建仿真环境,可以在没有硬件支持的情况下进行仿真和编程,并熟悉ros系统.环境使Ubuntu16.04 ...

  8. USB与电池切换电路图

  9. 小程序web-view加载H5信息不全

    满足小程序的web-view标签跳转网页形式 配置小程序后台的web-view(业务域名) 可打开关联的公众号的文章 通常实现逻辑 页面加载的时候赋值于一个data对象的值,然后赋值到web-view ...

  10. SQL之总结(二)

    4.关于取两个日期之间的年份: ceil(MONTHS_BETWEEN(sysdate, c.sendtime)/12) workTime ceil(n) 取大于等于n的最小整数 floor(n) 取 ...