P值计算好像不太对

来源:3-3 itemcf基础部分代码实战-下

朱思利

2018-12-11 13:35

老师你好,感谢分享!有个小问题:

ICF中最后P值计算,是指与J最相似的K个物品,和用户U操作过的物品的交集,把他们的s求和。这个应该要遍历所有物品吧?

但是视频代码中,取用户操作过的前3个物品,再取它最相似的K个物品,似乎不太符合

https://img2.mukewang.com/5c0f34080001447d05360176.jpg

我重写了下,老师你看有问题么,非常感谢!

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


写回答 关注

4回答

  • David
    2018-12-11 13:45:36
    已采纳

    您好,取了top几个物品是由于有时效性,推荐过程中,我们不可能把用户去年操作过的物品也拿过来做itemcf。因为随着时间推移。可能早已经不喜欢之前的物品了。所以召回过程中考虑到这一点。谢谢。

    慕莱坞920... 回复朱思利

    公式中规定的是与j最相似的k个物品,老师代码中好像当成了与i最相似的k个物品

    2019-01-25 18:49:08

    共 3 条回复 >

  • 慕莱坞9201401
    2019-01-25 21:58:23
    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

    上面那个不对,应该是这个

  • 慕莱坞9201401
    2019-01-25 19:00:21
    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


  • 慕莱坞9201401
    2019-01-25 18:57:52
    倒数第二句代码应该是recom_info[user][itemid_i] += sim_score,不是 itemid_j


个性化推荐算法实战入门必修课

带您初窥个性化推荐算法落地实战的门径

23507 学习 · 67 问题

查看课程

相似问题