推荐系统 TOP K 评价指标
符号说明
\(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 评价指标的更多相关文章
- [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 ...
- 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 ...
- 大数据热点问题TOP K
1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...
- LeetCode "Top K Frequent Elements"
A typical solution is heap based - "top K". Complexity is O(nlgk). typedef pair<int, un ...
- [IR] Ranking - top k
PageRanking 通过: Input degree of link "Flow" model - 流量判断喜好度 传统的方式又是什么呢? Every term在某个doc中的 ...
- 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 ...
- 面试题:m个长度为n的ordered array,求top k 个 数字
package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...
- 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 ...
- Top k问题(线性时间选择算法)
问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...
随机推荐
- CF914G Sum the Fibonacci(FWT,FST)
CF914G Sum the Fibonacci(FWT,FST) Luogu 题解时间 一堆FWT和FST缝合而来的丑陋产物. 对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求 ...
- (转)Linux的文件权限与目录配置
ref:https://www.cnblogs.com/ysocean/p/7712412.html#_label1_0 (转)Linux文件权限和目录配置 1.Linux命令的普遍语法格式 命令格式 ...
- 为什么 char 数组比 Java 中的 String 更适合存储密码?
另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题.这是一个真正艰难的核心Java面试问题,并且需要对 String 的扎实知识才能回答这个问题. ...
- MySQL 里记录货币用什么字段类型好?
NUMERIC 和 DECIMAL 类型被 MySQL 实现为同样的类型,这在 SQL92 标准允 许.他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数 据.当声明一个类是这些类型之 ...
- 你如何在 Java 中获取线程堆栈?
kill -3 [java pid] 不会在当前终端输出,它会输出到代码执行的或指定的地方去.比如,kill -3 tomcat pid, 输出堆栈到 log 目录下. Jstack [java pi ...
- 转载:mysql引擎innodb和MyIsam的区别
转载至:https://my.oschina.net/suyain/blog/1925807 Innodb引擎: 1.Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级 ...
- simulink仿真过程
Simulink求解器 Simulink仿真过程 Simulink 模型的执行分几个阶段进行.首先进行的是初始化阶段,在此阶段,Simulink 将库块合并到模型中来,确定传送宽度.数据类型和采样时间 ...
- (4)_结果与讨论Result and Discussion【论文写作】
- safari浏览器fixed后,被软键盘遮盖的问题—【未解决】
safari浏览器fixed后,被软键盘遮盖的问题,已经有好多人问相关的问题,应该是问的角度不一样,还的再次提出咯. 问题描述 测试环境:ios 10.2/10.3 简单来说就是在html5页面中底部 ...
- 洛谷 P5706 【深基2.例8】再分肥宅水
题目连接: P5706 [深基2.例8]再分肥宅水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 我提交的: 1 #include<iostream> 2 #inclu ...