HR(hit rate)
命中率。用户想要的东西,推荐系统有没有推荐出来,强调预测的"准确性"
N:表示用户的访问总量,就是用户真实点击的个数。
hit(i) :如果推荐系统推荐商品i,hit(i)就为1,否则为0。
MRR(平均倒数排名)
关心找到的这些项目,是否放在用户显眼的位置里,即强调顺序性。
N:表示用户的访问总量,就是用户真实点击的个数。
pi:表示itemi在推荐结果中出现的位置,如果没有出现,则pi就为+∞。
NDCG(Normalized Discounted Cumulative Gain)
关心找到的这些项目,是否放在用户显眼的位置里,即强调顺序性。
N:表示用户的访问总量,就是用户真实点击的个数。
pi:表示itemi在推荐结果中出现的位置,如果没有出现,则pi就为+∞。
实例:
代码实现
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)