大数据 13、推荐算法-CF

你挡我一时,挡不了我一世

发布日期: 2019-04-25 11:23:42 浏览量: 1059
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

前文链接:https://write-bug.com/article/2376.html

推荐算法

大数据Hadoop平台2-2、MapReduce和上节的实践中都提到了检索或推荐系统的数据来源的底层来源,那么这里即是召回阶段的算法。算法目的是侧重召回候选集合,粗排。

我们在看爱奇艺网站时,上面会有一些推荐的热榜栏目和个性化推荐栏目等,那么这里的基础算法是什么样的呢?

推荐算法简单分为两种:基于内容和协同过滤(行为)推荐

1.1 基于内容Content base

1.1.1 引入Item属性的Content Based推荐

在前面介绍过的实践中,我们利用token实现item的倒排,其实就类似找到了一些item和item之间的相关性信息。我们做的正排表的分词就是此图内容分析索引,而相关性计算就是倒排索引,把它保存在nosql后就可以直接查询了。

通常在网站主页中,不会做大面积的个性化推荐,其透漏着隐私问题会给用户带来困扰。

1.1.2 引入User属性的Content Based推荐

这里我们需要把item的token改成可以描述我用户行为偏好的token。

个性化

  • Step1:user搜索、点击、收藏过这些item时(也就是用户行为数据),可以用这些item的token 给 (用户分析) user做用户画像(兴趣建模)

  • Step2:—->倒排索引—-》token—-》索引—->item

  • Step3:相关计算cos、jaccard ∩/∪等

  • Step4:排序

1.2 基于协同Collaboration Filtering

核心:User对Item的打分形成UI稀疏矩阵(即只存储有行为的数据)。

存储可以类比原来的倒排索引:userid(key)—->(value)item item item

原来的倒排:一个token被几个item同时包含。

这里的倒排:一个用户对几个item有过行为,即被一个用户作用过的几个item有着相关性。

那稀疏矩阵是什么样子呢?

数据例:

  1. 1,100001,5
  2. 1,100002,3
  3. 1,100003,4
  4. 1,100004,3
  5. 1,100005,3
  6. 1,100007,4
  7. 1,100008,1
  8. 1,100009,5
  9. 1,1000011,2

这个稀疏矩阵就是UI矩阵,只存储用户有行为的数据,由此数据量可以大大减小:即倒排索引。

随着时间的推移,日志服务器会积累越来越多的行为数据形成UI矩阵。通常中型以上的互联网公司,用户量最少一亿以上(一个用户多个账号),音乐量级几十万以上,所以这个UI矩阵很大很大,需要用稀疏矩阵存储。

  • 由这个UI矩阵我们知道,userA对ItemBCD有过行为,那么由前面倒排索引的知识,我们可以得到itemA被哪些用户有过行为,得到了userlist,那我把ItemB为key就得到了UserA的好友列表。例:微博

  • 根据user A的好友列表userBCD,可以得到每个user背后的item列表,把这些item聚合推荐给userA。例:个性化推荐

  • 根据itemA背后的user列表做相似度关联,把每个用户背后的item聚合,在和itemA相关联。例:非个性化推荐

可由1我们得到user和user的矩阵即UU=UI*IU(UI的转置矩阵);可由3我们得到item和item的矩阵即II=IU*UI。由此我们引出了两种协同:User-Base CF和Item-Base CF。

1.2.1 user-Base —- CF:—————外交

假设:

– 用户喜欢那些跟他有相似爱好的用户喜欢的东西

– 具有相似兴趣的用户在未来也具有相似兴趣

方法:

– 给定用户u,找到一个用户的集合N(u),他们和u具有相似的兴趣

– 将N(u)喜欢的物品推荐给用户.

UI矩阵计算——————》 UU矩阵—————-用户之间相似度

流程:转置,归一,cos

目的:如果把一个user没看过的电影推荐给他,打一个分预测用户,对这个电影有多大的兴趣

  1. r(userid,itemid)=两个用户的相似度×另一个用户的打分 / 所有用户(随机选择一部分)相似度加和

这个结果,只需要基于同一套算法(UU / II)的排序,不需要具体分数。

1.2.2 item -Base —- CF:———自身历史行为

假设:

– 用户喜欢跟他过去喜欢的物品相似的物品

– 历史上相似的物品在未来也相似

方法:

– 给定用户u,找到他过去喜欢的物品的集合R(u)

– 把和R(u)相似的物品推荐给u

UI矩阵计算——————》 II矩阵—————电影之间相似度

流程:转置,归一,cos

目的:如果把一个user没看过的电影推荐给他,打一个分预测用户,对这个电影有多大的兴趣

  1. r(userid,itemid)=两个item的相似度×该用户的打分 / 所有item(随机选择一部分)相似度加和

什么时候用哪个算法?

  • 性能角度:谁维度小用谁

  • 领域:UB时效性(看是否火,用户之间相互影响),IB倾向于个性化(历史相似物品)

  • 实时性:IB更高:新行为导致推荐结果实时变化

  • 冷启动:UB需要时间离线计算,IB围绕产生新行为的物品无限推荐

  • 推荐理由:UB难解释

冷启动三类:—————-新东西——粗粒度吸引

  • 用户:推荐热门排行榜、注册年龄性别等做画像粗粒度推荐、社交网站导入好友信息推荐、新登陆反馈标签推荐

  • 物品:新物品通过基于内容推荐——-CB

  • 系统:不太好解释的,用户画像(职业)和物品(不懂这东西)———引入专家知识(知识图谱,人工校验等)建立相关物品矩阵

I I/UU 相似度计算公式:———————cos

类比cos=向量内积 / 向量模 ------把两个劈开相乘

——————> 归一化 ui / ui^2———————->两个Rui 评分相乘

比如上面的两个电影 M 和 T 的相似度是0.57

  1. U(i,j)=A B D

  1. R(ua,M)=5 , R(ua,T)=1
  2. R(ub,M)=1 , R(ub,T)=5
  3. R(ud,M)=4 , R(ud,T)=3

归一化:

  1. 25+1+16=42---根号42
  2. M:5/
  3. 1/
  4. 4/
  5. 1+25+9=35------根号35
  6. T:1/
  7. 5/
  8. 3/
  9. M*T=

实践:协同过滤————————给定一个item,推荐相关的item集合(II矩阵)

倒排式、分块式

倒排式流程:

遍历排列组合同一个人观看的所有item,得到很多相似度的pair;如果两个物品被越多的人贡献过,相似度越准确,去除偶然性误点。也就是排列出所有组合pair对,-----有几个相同对,相当于被几个人贡献过。相同的pairkey会分在同一个桶里,计算相似度分数就会越准确---套公式(reduce中)

  • Step1:归一UI矩阵:

    • Map:
      • 矩阵输入数据:U,I,S
      • 输出:Key(i),Value(u,s)对
    • Reduce:
      • 输入:Key(i),Value(u,s)对
      • 输出:Key(u),Value(i,s_new)对
  • Step2:衍生 I I Pair对:

    • Map:
      • 输入:Key(u),Value(i,s_new)对
      • 输出:Key(u),Value(i,s_new)对
    • Reduce:
      • 输入:Key(u),Value list((i,s_new))对
      • 输出:Key_1(i) , Value_1(j,s_new_is_new_j)
        Key_2(i) , Value_2(i,s_new_i
        s_new_j)
  • Step3:result :

    • Map:
      • 输入: Key(i) , Value(j,s_new_i*s_new_j)
      • 输出:Key<i,j> , Value(s_new_i*s_new_j)
    • Reduce:
      • 输入:Key<i,j> , Value list((s_new_i*s_new_j))
      • 输出:Key(i) , Value(j,score)

前面说了一些最基础的推荐算法,但是其中存在了一些问题,我们会在后面更新基础的聚类算法中指出。
并且在其中我们使用倒排式实现了协同过滤,突出了MR批量计算和对大规模UI矩阵的批量处理,但在其中代码的缺点也很明显,我们输入的UI矩阵产生pair对时,会产生比UI大得多的数据,并会有一些重复数据,很容易爆掉内存,所以我们需要优化在UI矩阵中取物品需要对每一个用户的物品候选集合设置阈值,也就是pair对多少的阈值,如果说一个用户点击了几乎所有item,pair数据指数级增长,内存就会立刻爆掉。



后面:聚类、MF(ALS、LFM、SVD、SVD++)、ANN

上传的附件
最近文章
eject