协同过滤的定义:通过找到兴趣相投,或者有共同经验的群体,来向用户推荐感兴趣的信息。
适用场景:被推荐用户有过比较多历史动作,并且其他用户也有过比较多的历史动作
举例:
以推荐用户电影为例,假设有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