老师你好,感谢分享!有个小问题:
ICF中最后P值计算,是指与J最相似的K个物品,和用户U操作过的物品的交集,把他们的s求和。这个应该要遍历所有物品吧?
但是视频代码中,取用户操作过的前3个物品,再取它最相似的K个物品,似乎不太符合
我重写了下,老师你看有问题么,非常感谢!
def cal_recom_result_2(sim_info,user_click): """ recom by item collaboritive filter Args: sim_info:item sim dict user_click:user click dict Return: dict,key:userid value dict, value_key itemid,value_value recome_score """ topk = 5 recom_info = {} for user in user_click: click_list = user_click[user] recom_info.setdefault(user,{}) for itemid_i,sim_item in sim_info.items(): for itemid_j,sim_score in sim_item[:topk]: if itemid_j not in click_list: continue recom_info[user].setdefault(itemid_j,0) recom_info[user][itemid_j] += sim_score return recom_info
您好,取了top几个物品是由于有时效性,推荐过程中,我们不可能把用户去年操作过的物品也拿过来做itemcf。因为随着时间推移。可能早已经不喜欢之前的物品了。所以召回过程中考虑到这一点。谢谢。
for user_id, item_list in user_click: recom_result.setdefault(user_id, {}) for itemi, sim_dict in sim_info: for itemj, val in sim_info[itemi][:k]: if itemj not in item_list[:recent_click_num]: continue recom_result[user_id].setdefault(itemi, 0) recom_result[user_id][itemi] = val
上面那个不对,应该是这个
recent_click_num = 3 k = 3 for user_id, item_set in user_click.items(): recom_result.setdefault(user_id, {}) for item_id1 in item_set[:recent_click_num]: if item_id1 not in sim_info: continue for item_id2, val in sim_info[item_id1]: if item_id1 not in sim_info[item_id2][:k]: continue recom_result[user_id].setdefault(item_id2, 0) recom_result[user_id][item_id2] = val return recom_result
倒数第二句代码应该是recom_info[user][itemid_i] += sim_score,不是 itemid_j