def _sparse_dot(self, tst_mat, i2i_mat):
# scipy always returns sparse result, even if dot product is actually dense
# this function offers solution to this problem
# it also takes care on sparse result w.r.t. to further processing
if self.dense_output: # calculate dense result directly
# TODO implement matmat multiplication instead of iteration with matvec
res_type = np.result_type(i2i_mat.dtype, tst_mat.dtype)
scores = np.empty((tst_mat.shape[0], i2i_mat.shape[1]), dtype=res_type)
for i in xrange(tst_mat.shape[0]):
v = tst_mat.getrow(i)
scores[i, :] = csc_matvec(i2i_mat, v, dense_output=True, dtype=res_type)
else:
scores = tst_mat.dot(i2i_mat.T)
# NOTE even though not neccessary for symmetric i2i matrix,
# transpose helps to avoid expensive conversion to CSR (performed by scipy)
if scores.nnz > NNZ_MAX:
# too many nnz lead to undesired memory overhead in downvote_seen_items
scores = scores.toarray(order='C')
return scores
评论列表
文章目录