• 推荐算法之协同过滤


    协同过滤的定义:通过找到兴趣相投,或者有共同经验的群体,来向用户推荐感兴趣的信息。

    适用场景:被推荐用户有过比较多历史动作,并且其他用户也有过比较多的历史动作


    举例:

    以推荐用户电影为例,假设有100W用户,10W电影,用户的id为uid1,uid2,uid3... 电影的id为mid1,mid2,mid3....

    (1)画表格,横坐标表示所有电影,纵坐标表示所有用户,交叉点为某个用户喜欢某部电影

     mid1mid2mid3mid4mid5mid10W
    uid1111 1   
    uid21111    
    uid3111     
    uid41 1 1   
            
            
    uid100W1   1   

    如表所示,1表示用户喜欢这部电影,所有的数据源我们都已经处理完毕

    ps:

    a.数据源来自于所有的服务器落地数据,包括但不仅限于db、日志;

    b.“喜欢”这个词该怎么定义是这一步的难点,在这个例子中,我们可以拿用户的某些动作来定义为喜欢,如:用户浏览过这部电影、用户点赞过这部电影、用户查找过这部电影、用户观看过这部电影等等


    (2)基于上面的数据,我们来拿出所有用户的喜欢的电影集合

    uid1:{mid1,mid2,mid3,mid5}

    uid2:{mid1,mid2,mid3,mid4}

    uid3:{mid1,mid2,mid3}

    uid4:{mid1,mid3,mid5}


    (3)找到每个uid的mid集合交集最多的数据

    uid1交集最多的是uid2,uid3,uid4

    uid2交集最多的是uid1,uid3

    uid3交集最多的是uid1,uid2

    uid4交集最多的是uid1

    ps:这步可以优化为,直接先找看看有没有哪个uid的mid集合是直接包含了要查找的uid的集合的(即该用户的mid集合是其他用户mid集合的子集/真子集),如果有,则该集合就是我们要找的集合;如果没有,则进行如上算法

    例如,这里的uid3,可以看到,uid3的mid集合就是uid1和uid2的mid集合的真子集,所以,我们就可以直接判断,和uid3交接最多的就是uid2和uid3


    (4)计算交集最多的集合跟自己集合的差集,如,

    uid1和uid2的差集:{mid1,mid2,mid3,mid4} - {mid1,mid2,mid3,mid5} = {mid4},以此类推

    uid1和uid3的差集是空集,uid1和uid4的差集也是空集

    拿着这些所有的差集做并集:uid的差集并集集合是{mid4}

    故:要推荐给uid1的电影集合为{mid4}

    以此类推:

    要推荐给uid2的电影集合为{mid5}

    要推荐给uid3的电影集合为{mid4,mid5}

    要推荐给uid4的电影集合为{mid2}



    协同过滤以下有几个难点:

    1.如何定义一个用户对一件事物持有的态度

    2.这里把对事物的态度简化了,其实用户对一件事物的态度应该是个权值,以这个看电影为例子,我们可以把用户点赞作为10分,浏览作为3分等,但是这样做就增加了整个推荐系统的复杂度

    3.最重要也是最难的一点,该算法必须要有大数据的支持



    参考文章:http://mp.weixin.qq.com/s/eJZDqoM6Fz6KeD4MEjVFYQ

  • 相关阅读:
    Emacs 使用YASnippet
    odbc备忘
    Emacs 矩形编辑
    ftp by libcurl
    emacsshell
    Emacs cnblogs 代码着色
    Emacs下的Man
    #include ""还是<>
    三种*
    应对Maze勒索攻击的最佳实践分享
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872219.html
Copyright © 2020-2023  润新知