推荐算法之协同过滤

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

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


举例:

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

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

  mid1 mid2 mid3 mid4 mid5 mid10W
uid1 1 1 1   1      
uid2 1 1 1 1        
uid3 1 1 1          
uid4 1   1   1      
               
               
uid100W 1       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

猜你喜欢

转载自blog.csdn.net/mweibiao/article/details/79743793