zoukankan      html  css  js  c++  java
  • 大数据量下协同推荐的难点与优化方法

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

    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)的相似度,计算结果和去除前一样。对于较为稀疏的矩阵,这个优化效果很明显。

    未经同意,请不要转发

  • 相关阅读:
    教你如何在 Visual Studio 2013 上使用 Github
    如果你也会C#,那不妨了解下F#(1):F# 数据类型
    博客园主题美化
    适配器模式 实战
    mysql in 超过1000 解决方案
    shell: 循环日期+1
    sqoop export 报错:Got exception running Sqoop: org.kitesdk.data.DatasetNotFoundException: Descriptor location does not exist:
    git 回滚到执行版本,并推送到远程分支
    hive表增加字段,并指定字段位置
    微信抢红包架构设计
  • 原文地址:https://www.cnblogs.com/Xjng/p/11323228.html
Copyright © 2011-2022 走看看