0%

我们用一张表格展示推荐系统向用户推荐的列表与用户真实的访问项目,如下:

用户 真实值 推荐列表 是否命中
A 12 3,10,15,12,17 是(1)
B 3 20,15,18,14,30 否(0)
C 5 2,5,7,8,15 是(1)
D 14 56,14,25,12,19 是(1)
E 20 21,24,36,54,45 否(0)

评价指标的来源是根据TKDE-2019中的一篇论文使用的方法:

image-20230503144653099

1. 命中率 HR(Hits Ratio)

意义:关心用户想要的,我有没有推荐到,强调预测的“准确性

image-20230503143652239

参数说明:
N: 用户的总数量
hits(i) = 0 or 1,命中为1,没命中为0

2. 归一化折损累计增益(Normalized Discounted Cumulative Gain,NDCG)

意义:关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“

image-20230306201553376

参数说明:
N: 用户的总数量
pi: 第i个用户的真实访问值在推荐列表的位置,若推荐列表不存在该值,则pi→∞

减函数,所以越靠前NDCG越大

3. 平均倒数排名(Mean Reciprocal Rank,MRR)

意义:关心找到的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“

image-20230306201938014

参数说明:
N: 用户的总数量
pi: 第i个用户的真实访问值在推荐列表的位置,若推荐列表不存在该值,则pi→∞

减函数,所以越靠前MRR越大

MRR和NDCG类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import math

# 推荐列表
R = [[3, 10, 15, 12, 17], [20, 15, 18, 14, 30], [2, 5, 7, 8, 15], [56, 14, 25, 12, 19], [21,24,36,54,45]]
# 用户访问列表
T=[[12],[3],[5],[14],[20]]


def indicators_5(rankedList, testList):
Hits_i = 0
Len_R = 0
Len_T = len(testList)
MRR_i = 0
HR_i = 0
NDCG_i = 0
for i in range(len(rankedList)):
for j in range(len(rankedList[i])):
if testList[i][0]==rankedList[i][j]:
Hits_i+=1
HR_i+=1
# 注意j的取值从0开始
MRR_i+=1/(j+1)
NDCG_i+=1/(math.log2(1+j+1))
break
HR_i/=Len_T
MRR_i/=Len_T
NDCG_i/=Len_T
print(Hits_i)
print(f'HR@5={HR_i}')
print(f'MRR@5={MRR_i}')
print(f'NDCG@5={NDCG_i}')



if __name__ == '__main__':
indicators_5(R, T)

关系

image-20230402181016238

寄存器

寄存器(register)是CPU(中央处理器)的组成部分,是一种直接整合到cpu中的有限的高速访问速度的存储器,它是有一些与非门组合组成的,分为通用寄存器和特殊寄存器。cpu访问寄存器的速度是最快的。那为什么我们不把数据都存储到寄存器中呢,因为寄存器是一种容量有限的存储器,并且非常小。因此只把一些计算机的指令等一些计算机频繁用到的数据存储在其中,来提高计算机的运行速度。

缓存(Cache)

缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

因为缓存往往使用的是RAM(断电即掉的非永久储存),所以在用完后还是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给显卡运算芯片用的缓存,硬盘上也有16M或者32M的缓存。

CACHE是在CPU中速度非常块,而容量却很小的一种存储器,它是计算机存储器中最强悍的存储器。由于技术限制,容量很难提升。

对于大多数人来说Cache,是透明的、不存在的。其中一个原因是Cache是集成到CPU中,对于程序员来说是透明的。

阅读全文 »