def score(self, user, candidates, context):
# i_mat is (n_item_context, n_item) for all possible items
# extract only target items
i_mat = self.i_mat[:, candidates]
n_target = len(candidates)
u_vec = user.encode(dim=self.n_user,
index=self.use_index,
feature=True,
vertical=True)
u_vec = np.concatenate((u_vec, np.array([context]).T))
u_mat = sp.csr_matrix(np.repeat(u_vec, n_target, axis=1))
mat = sp.vstack((u_mat, i_mat))
# Matrix A and B should be dense (numpy array; rather than scipy CSR matrix) because V is dense.
V = sp.csr_matrix(self.V)
A = safe_sparse_dot(V.T, mat)
A.data[:] = A.data ** 2
sq_mat = mat.copy()
sq_mat.data[:] = sq_mat.data ** 2
sq_V = V.copy()
sq_V.data[:] = sq_V.data ** 2
B = safe_sparse_dot(sq_V.T, sq_mat)
interaction = (A - B).sum(axis=0)
interaction /= 2. # (1, n_item); numpy matrix form
pred = self.w0 + safe_sparse_dot(self.w, mat, dense_output=True) + interaction
return np.abs(1. - np.ravel(pred))
评论列表
文章目录