推荐系统 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小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...
随机推荐
- ES6中数组新增的方法-超级好用
Array.find((item,indexArr,arr)=>{}) 掌握 找出第一个符合条件的数组成员. 它的参数是一个回调函数,对所有数组成员依次执行该回调函数. 直到找出第一个返回值为t ...
- CSS入门笔记
CSS @author:伏月廿柒 Cascading Style Sheet 层叠级联样式表 CSS:表现(美化) 字体,颜色,边距,高度,宽度,背景图片,网页定位,网页浮动-- CSS发展史 CSS ...
- Makefile学习(一)
objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o ...
- 使用SpringDataJdbc的@Query注解实现自动映射结果集 ----- RowMapper接口
使用@Query注解的时候,常常需要写sql来映射非域类的实例,通常的做法就是 实现 RowMapper接口,然后new实例一个一个的设置值进去...为此.出世了自动映射工具类 注意事项:此抽象类只是 ...
- Java程序要操作数据库,一定要使用JDBC技术吗?
<!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency> <groupId>mysql</groupId> <a ...
- linux发布常用命令
一.linux发布常用命令 //启动Tomcat sh /opt/apache-tomcat-8.5.29/bin/startup.sh //停止tomcat sh /opt/apache-tomca ...
- Linux 中进程有哪几种状态?在 ps 显示出来的信息中, 分别用什么符号表示的?
1.不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的.不可中断, 指进程不响应异步信号. 第 441 页 共 485 页2.暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响 ...
- java-LinkedMap
输入一组数,输出是按每个出现的频率,比如1,3,3,4,5,9,9,9,3,3,输出为3,3,3,3,9,9,9,1,4,5如果频率一样就按原顺序输出. package com.lyb.array;i ...
- Python学习--21天Python基础学习之旅(Day05、Day06、Day07)
Day05: Chapter 8 函数 1.1函数定义与调用 1.1.1向函数传递参数 1.2传递实参 1.2.1位置实参:基于实参顺序 1.2.2关键字实参:调用时指出各个实参对应的形参 1.2.3 ...
- (stm32学习总结)—对寄存器的理解 _
芯片里面有什么 我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成.若与电脑类比,内核与外设就如同电脑上的 CPU 与主板.内存.显卡.硬盘的关系.STM32F103 采用的是 ...