老师你好,感谢分享!有个小问题:
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