大数据量下协同推荐的难点与优化方法

大数据量是指百万级别以上
协同推荐的算法细节在这里就不论述了,网上有很多文章介绍算法的原理的。

1. 难点一:矩阵过大

在协同推荐中,第一步是构建用户和物品的矩阵,例如:

评分 用户A 用户B
物品A 1 2
物品B 3 4
物品C 1 4

当用户量和物品量都比较小的时候,例如几千,几万,这样构建矩阵是没问题的,但是如果用户量和物品量去到几百万,几千万的时候,这样就不能构建了,因为内存顶不住。

假如用户量和物品量都是100万,评分用int类型,也就是4字节存储
那就需要100kw100kw4的内存量,也就是4TB。不要说内存,硬盘也扛不住这个量。

2.难点二:推荐计算量大

如果来一个新用户C,需要把新用户C加入到矩阵,
然后计算:

  1. 计算C和矩阵其他用户的相似度
  2. 通过相似度,计算C对所有物品的评分预测
  3. 获取评分预测最大的N个物品

如果做热计算(用户请求推荐接口时做计算),这个计算很难做到几秒内返回,所以满足不了产品的需求(因为用户等不及)
如果做冷计算(预先为用户计算好,例如每天晚上为所有用户计算推荐物品),在大用户量的前提下,这个计算用时和存储空间的成本都是很大的

3.难点一和二的解决方法:

解决方法是可以修改协同推荐的逻辑
修改为:

  1. 计算物品之间的相似度,对每个物品,计算与之相似度最大的N个物品,存储下来
  2. 对于每个用户,获取他对所有物品的评分,用每个物品的评分,乘以这个物品最相似的N个物品的相似度,得到这个用户对这些个物品的预测评分
  3. 获取预测评分最好的N个物品,推荐给用户

这样的特点

  1. 存储空间减少:物品数*N就可以了,N一般是1000或者10000
  2. 热计算速度快,耗时的相似度计算可以放在冷计算,热计算只有乘计算,比较简单,速度快(当然也可以预先为部分活跃用户计算推荐物品,进一步提升推荐速度)
  3. 用户冷启动较快,物品冷启动较慢。所以适合对新物品不太敏感的产品。
  4. 推荐精度会有所下降,因为只获取相似度最高的N个物品,而不是全部。但是总体效果还可以。

4.难点三:相似度算法耗资源,算法复杂度高

协同推荐,要计算物品和物品之间,或者用户和用户之间的相似度。常用的相似度算法是余弦相似度,这个计算较为复杂,耗CPU资源。
复杂度也较高,是O(N的平方),所以优化余弦相似度算法的计算,对整体的计算速度收益较大。

5.余弦相似度的优化方法:

  1. 分子是0,不计算分母
    计算相似度时,先计算分子,如果分子是0,就不需要计算分母了,这样可以节省时间
  2. 去除两个向量相同列的数据都是0的列
    例如向量A是(1,0,1,3),向量B是(2,0,3,4),两个向量的第二个列的值都是0,所以可以把这列去除,改为计算向量(1,1,3)和 (2,3,4)的相似度,计算结果和去除前一样。对于较为稀疏的矩阵,这个优化效果很明显。

未经同意,请不要转发

posted @ 2019-08-08 19:22 Xjng 阅读(...) 评论(...) 编辑 收藏