大话召回之 - UserBasedCF、ItemBasedCF

0、背景

在推荐系统中,我们经常遇到 “猜你喜欢、看了又看、看过该商品的人还看过” 等等场景,没错,这些场景大部分就是以我们本次所讲的userCF和itemCF实现的。

CF,即Collaboration Filter,就是老生常谈的协同过滤。

在一些更高级的场景中,我们甚至可以用强化学习去改造这些近邻算法,这里,我们只讨论这些算法最基础的原理,并以一个最简单的例子去实践。

userCF和ItemCF其实非常非常的近似,前期的数据准备工作基本通用,只是在最后一步求解相似集的时候发生了变化。这里,我们不按这二者分别讲解,因为前期准备是一样的,我们按照下面3个步骤去求解:

  • 用户行为数据准备
  • 根据行为数据求解Item间的相似矩阵
  • 根据前两步的数据,求解userBasedCF和itemBasedCF列表

1、准备

我们假设一个场景,用户在某音乐APP中听歌。我们分析日志,得到了用户的行为操作列表,我们记有效播放(播放30s以上)为1分,点击收藏为3分,搜索点击为5分,那么就得到了:

Column_UserId	Column_MusicId	Column_EventScore
A				1				3
A				3				5
B				1				3
B				2				1

我们用图表表示:

用户/音乐 音乐1 音乐2 音乐3
A 3 0 5
B 3 1 0

即为用户的 “行为评分矩阵”,我们记为 α,这是一个 3X2的矩阵

2、根据行为数据求解Item间的相似矩阵

接下来,我们就要根据1中计算的行为评分矩阵α计算相似度矩阵,我们记为β。

那么如何计算相似度呢?

计算相似度的方式有很多,如余弦相似度、切比雪夫距离、欧里几得距离、曼哈顿距离、杰卡德距离、皮尔森系数……计算相似度的方式不同计算出来的相似度也不同。我们在这里介绍推荐系统中最为常见、效果也普遍比较好的余弦相似度进行计算。

计算公式如下:
s i m ( i , j ) = ∑ k = 1 n R i k ∗ R j k ∑ k = 1 n R i k 2 ∑ k = 1 n R j k 2 sim(i,j) = { {\sum^{n}_{k=1}R_{ik}*R_{jk}} \over {\sqrt{\sum^{n}_{k=1}R_{ik}^2}\sqrt{ \sum^{n}_{k=1}R_{jk}^2}} } sim(i,j)=k=1nRik2 k=1nRjk2 k=1nRikRjk

分母是计算两个物品向量的长度,求元素值的平方和再开方。分子是2个向量的点积,相同位置的元素相乘再求和

看起来似乎有点抽象,但其实就是求2个向量之间的夹角大小:
假设有二维向量a,b如下图所示
大话召回之 - UserBasedCF、ItemBasedCF_第1张图片
则他们的余弦相似度为:
c o s ( θ ) = a ⋅ b ∣ a ∣ × ∣ b ∣ cos(\theta) = {{a \cdot b}\over{|a|\times|b|}} cos(θ)=a×bab
继续推导:
c o s < a , b > = x 1 × x 2 + y 1 × y 2 ( x 1 2 + x 2 2 ) × ( y 1 2 + y 2 2 ) cos<a,b> = {{x_1\times{x_2}+{y_1}\times{y_2}}\over{\sqrt{(x_1^2+x_2^2)\times{(y_1^2+y_2^2)}}}} cos<a,b>=(x12+x22)×(y12+y22) x1×x2+y1×y2
到这里,问题就简化了,其实就是求向量之间的夹角大小,如果趋近于0,那么夹角为180°,毫无关系; 如果趋近为1,那么夹角为0°,几乎相等

那么,我们就可以计算出相似矩阵,也叫共现矩阵:
(为了看起来更加直观,我这里不计算出具体的值,直接用字段名表示)

音乐/音乐 音乐1 音乐2
音乐1 m11 m12
音乐2 m21 m22

你可能感兴趣的:(算法,机器学习,召回,itemcf,算法)