recommandation

本文最后更新于:2024年2月8日 中午

recommendaion system

merics

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
np.random.seed(2021)

class Model:
def __init__(self, k):
self.k = k
self.item_size = 50

def __call__(self, users):
# 模型随机返回 k 个 item,模拟推荐结果
res = np.random.randint(0, self.item_size, users.shape[0] * self.k)#随机生成数组的整数,生成的大小位于前两个参数之间,生成的长度是第三个参数
return res.reshape((users.shape[0], -1)) #reshape是转换为二位数组 行数用前一个参数确定,-1指的是列数自动确定


def get_implict_matrix(rec_items, test_set):
rel_matrix = [[0] * rec_items.shape[1] for _ in range(rec_items.shape[0])]#shape[1]定义了列数,同时[0]*把所有的元素赋值为零
for user in range(len(test_set)):
for index, item in enumerate(rec_items[user]):
if item in test_set[user]:
rel_matrix[user][index] = 1
return np.array(rel_matrix)


def DCG(items):
return np.sum(items / np.log(np.arange(2, len(items) + 2))) # np.sum传入数组可以实现对于数组中两个数以此 同时需要采用的np.array的数据类型


def nDCG(rec_items, test_set):
assert rec_items.shape[0] == len(test_set)
# 获得隐式反馈的rel分数矩阵
rel_matrix = get_implict_matrix(rec_items, test_set)
ndcgs = []
for user in range(len(test_set)):
rels = rel_matrix[user]
dcg = DCG(rels)
idcg = DCG(sorted(rels, reverse=True))#作为最理想的定义方法,以此定义排序方法的好坏
ndcg = dcg / idcg if idcg != 0 else 0
ndcgs.append(ndcg)
return ndcgs


# 假设 top-20 推荐,一共 5 个 user, 50 个 item ,隐式反馈数据集.
users = np.array([0, 1, 2, 3, 4])
# test_set 表示 5 个用户在测试集中分表交互过那些 item
test_set = [
[0, 21, 31, 41, 49],
[2, 3, 4, 5, 33],
[5, 10, 20, 30, 39, 44, 45, 49],
[4, 7, 13, 15],
[2]
]

model = Model(20)
rec_items = model(users)
ndcgs = nDCG(rec_items, test_set)
print(ndcgs)

recommandation
http://example.com/2023/09/06/recommandation/
作者
NGC6302
发布于
2023年9月6日
许可协议