大数据量是指百万级别以上
协同推荐的算法细节在这里就不论述了,网上有很多文章介绍算法的原理的。
1. 难点一:矩阵过大
在协同推荐中,第一步是构建用户和物品的矩阵,例如:
评分 | 用户A | 用户B |
---|---|---|
物品A | 1 | 2 |
物品B | 3 | 4 |
物品C | 1 | 4 |
当用户量和物品量都比较小的时候,例如几千,几万,这样构建矩阵是没问题的,但是如果用户量和物品量去到几百万,几千万的时候,这样就不能构建了,因为内存顶不住。
假如用户量和物品量都是100万,评分用int类型,也就是4字节存储
那就需要100kw100kw4的内存量,也就是4TB。不要说内存,硬盘也扛不住这个量。
2.难点二:推荐计算量大
如果来一个新用户C,需要把新用户C加入到矩阵,
然后计算:
- 计算C和矩阵其他用户的相似度
- 通过相似度,计算C对所有物品的评分预测
- 获取评分预测最大的N个物品
如果做热计算(用户请求推荐接口时做计算),这个计算很难做到几秒内返回,所以满足不了产品的需求(因为用户等不及)
如果做冷计算(预先为用户计算好,例如每天晚上为所有用户计算推荐物品),在大用户量的前提下,这个计算用时和存储空间的成本都是很大的
3.难点一和二的解决方法:
解决方法是可以修改协同推荐的逻辑
修改为:
- 计算物品之间的相似度,对每个物品,计算与之相似度最大的N个物品,存储下来
- 对于每个用户,获取他对所有物品的评分,用每个物品的评分,乘以这个物品最相似的N个物品的相似度,得到这个用户对这些个物品的预测评分
- 获取预测评分最好的N个物品,推荐给用户
这样的特点
- 存储空间减少:物品数*N就可以了,N一般是1000或者10000
- 热计算速度快,耗时的相似度计算可以放在冷计算,热计算只有乘计算,比较简单,速度快(当然也可以预先为部分活跃用户计算推荐物品,进一步提升推荐速度)
- 用户冷启动较快,物品冷启动较慢。所以适合对新物品不太敏感的产品。
- 推荐精度会有所下降,因为只获取相似度最高的N个物品,而不是全部。但是总体效果还可以。
4.难点三:相似度算法耗资源,算法复杂度高
协同推荐,要计算物品和物品之间,或者用户和用户之间的相似度。常用的相似度算法是余弦相似度,这个计算较为复杂,耗CPU资源。
复杂度也较高,是O(N的平方),所以优化余弦相似度算法的计算,对整体的计算速度收益较大。
5.余弦相似度的优化方法:
- 分子是0,不计算分母
计算相似度时,先计算分子,如果分子是0,就不需要计算分母了,这样可以节省时间 - 去除两个向量相同列的数据都是0的列
例如向量A是(1,0,1,3),向量B是(2,0,3,4),两个向量的第二个列的值都是0,所以可以把这列去除,改为计算向量(1,1,3)和 (2,3,4)的相似度,计算结果和去除前一样。对于较为稀疏的矩阵,这个优化效果很明显。
未经同意,请不要转发