推荐系统
一、推荐系统基础介绍
1、定义
研究用户在平台上的所有行为,对用户进行人物画像,以及研究平台上的内容/产品,同时把用户和产品匹配起来的过程。
2、作用
通过梳理和优化用户关系网络,实现加速高价值用户关系构建、优质内容传播和商业化营收等目标。
3、应用范围
推荐系统在各个领域有广泛的应用,比如电商网站、视频网站、视频直播平台、新闻客户端、文字网站、音乐网站等。
4、个人化推荐的准则
推荐理由:如好友推荐、名人推荐、媒体推荐、人以群分(与您口味相似的人都。。。)、用户行为(最近7天浏览过。。。)
推荐方式多样化:多维度、多方法
推荐的维度可以是:用户细分(学生、幼儿、职场人员),内容分类(军事、时事、娱乐)
推荐系统常用的应用场景举例:
1.APP首页的“推荐”、“热门”
2.在发现栏目给用户推荐感兴趣的内容
3.内容详情页的关联推荐/相关推荐
4.阅读结束/视频播放结束/直播结束推荐
5.搜索页面推荐
二、算法及应用举例
2.1 推荐系统常用算法
推荐系统中常用到的算法包括用户偏好算法、协同过滤算法(item_base,user_base)、关联规则算法、聚类算法、内容相似性算法(content_base),以及一些其他的补充算法。
1、根据用户偏好算法可以算出用户感兴趣的内容或产品,然后推荐给用户。
2、item_base(基于内容的协同过滤算法)是根据集体用户行为算出物品间的相似度,然后把与用户看过的物品或者购买的物品最相似的物品推荐给该用户。
3、user_base(基于客户的协同过滤算法)是根据集体行为计算用户之间的相似度,比如A跟B计算出来非常相似,则可以把B喜欢的但A还没有看过的内容,推荐给A。
4、根据关联规则算法,可以计算出物品间的支持度和置信度。最常见的应用就是组合购买,百分之八十买了A商品的人都买了B商品。
5、聚类算法可以根据用户进行聚类,也可以对产品进行聚类。聚类后可以针对大类进行推荐,或者继续计算用户类和产品类之间的关系。
6、content_base(内容相似性算法)是根据物品本身的属性进行关联性运算,计算出物品间的相似性,最常见的应用是同类推荐。
2.2 个性化推荐如如何冷启动
对于一款产品刚上市,该如何应用个性化推荐算法呢?无论是基于用户行为的个性化还是基于内容相似度的个性化,都是需要建立在大量的用户数和内容的基础上的。在产品发布初期,个性化推荐无法应用,这时一般采用“热度算法”
2.2.1 热度算法
热度算法就是把热点内容优先推荐给用户,虽然无法做到基于兴趣和习惯为每一个用户做到精准化的推荐,但能覆盖到大部分的内容需求,而且启动成本比个性化推荐算法低太多。所以冷启动时一般先采用“热度算法”将热点先推荐给客户,获取一定的用户数据后再启动个性化推荐。
2.2.2 设计热度算法
以新闻为例
-
基本原理
新闻热度分 = 初始热度分 + 用户交互产生的热度分 - 随时间衰减的热度分
S c o r e = S 0 + S ( U s e r s ) − S ( T i m e ) Score=S0+S(Users)-S(Time) Score=S0+S(Users)−S(Time)
这里需要给以上三者定值:新闻入库后,系统为之赋予一个初始热度值,该新闻就进入了推荐列表;随着新闻不断被用户点击阅读、收藏、分享等,这些行为被视作帮助新闻提升热度,系统需要为每一种交互操作产生的热的分赋值;同时,新闻是较强时效性的内容,因此新闻发布之后,热度必须随着新闻变得陈旧而衰减,系统需要为新闻随时间的衰减分赋值。最后根据算出来的新闻热度决定在推荐列表中的排序。新闻热度不断变化,推荐列表的排序也就不断变化。 -
初始热度分
实践中发现不同新闻受关注度不同,比如,娱乐类别比文化类别受欢迎程度本身就高很多;或者突发了严重的灾害事故;或者在奥运会期间,体育类别受关注度就会很高。因此,初始热度分应该设置为变量。我们可以这样做:
(1)分类给分。按照新闻类别给予新闻不同的初始热度,让用户关注度高的类别获得更高的初始热度分,从而获得更多的曝光。 S 0 → S 0 ( T y p e ) S0\rightarrow S0(Type) S0→S0(Type) ,例如:
(2)热词匹配。对于重大事件的报道,为让其入库时就有更高的热度,可采用的是热词匹配的方式。即对大型新闻站点的头条、Twitter热点、竞品的头条做监控和扒取,并将这批新闻的关键词维护到热词库中并保持更新;每条新闻入库的时候,让新闻的关键词去匹配热词库,匹配度越高,就有越高的初始热度分。
这样处理后,重大事件发生时,各网站的争相报道会导致热词集中化,所有匹配到这些热词的新闻,即报道同样事件的新闻,会获得很高的初始热度分。 -
用户交互产生的热度分
确定用户会有哪些操作,具体操作会产生多少的热度分。比如一条新闻用户可以点击阅读(click)、收藏(favor)、分享(share)、评论(comment)这四种行为。我们为不同的行为赋予分数,就能得到新闻的实时用户行为分:
S ( U s e r s ) = 1 ∗ c l i c k + 5 ∗ f a v o r + 10 ∗ c o m m e n t + 20 ∗ s h a r e S(Users)=1*click+5*favor+10*comment+20*share S(Users)=1∗click+5∗favor+10∗comment+20∗share
实践中发现不同新闻用户规模不同,会导致用户行为的影响力不同,所以这里对不同行为赋予的分数1,5,10,20,这个值不能时一成不变的。当用户规模小的时候,各项事件都小,此时需要提高每个事件的行为分来提升用户行为的影响力;当用户规模变大时,行为分也应该慢慢降低。因此,做内容运营时,应该对行为分不断调整,或者用偷懒的方法,把用户规模也考虑进去,算固定用户数的行为分,即:
S ( U s e r s ) = ( 1 ∗ c l i c k + 5 ∗ f a v o r + 10 ∗ c o m m e n t + 20 ∗ s h a r e ) / D A U ∗ N ( 固 定 数 ) S(Users)=(1*click+5*favor+10*comment+20*share)/DAU*N(固定数) S(Users)=(1∗click+5∗favor+10∗comment+20∗share)/DAU∗N(固定数)
这样就保证了在不同用户规模下,用户行为产生的行为分基本稳定。 -
时间衰减
参考牛顿冷却定律,时间衰减因子应该是一个类似于指数函数: T ( T i m e ) = e ( k ∗ ( T 1 − T 0 ) ) T(Time)=e^{(k*(T1-T0))} T(Time)=e(k∗(T1−T0))
其中, T 0 T0 T0是新闻发布时间, T 1 T1 T1是当前时间。 -
热度算法调优
按照之前的算法“ S c o r e = S 0 + S ( U s e r s ) − S ( T i m e ) Score=S0+S(Users)-S(Time) Score=S0+S(Users)−S(Time)”,热度和时间是线性关系,如下图中的红线。而由于新闻的强时效性,已经发布的新闻的热度值必定随着时间而衰减,并且衰减趋势应该是衰减的越来越快的,直至趋近于零,如下图绿线:
因此,可将热度算法调整为:
S c o r e = S 0 ( T y p e ) + S ( U s e r s ) T ( T i m e ) Score=\frac{S0(Type)+S(Users)}{T(Time)} Score=T(Time)S0(Type)+S(Users) -
总结以上几条就是:
初始热度分不应该一致;用户行为分规则不是固定不变的;热度随时间的衰减不是线性的。 -
其他影响因素
实际应用中,用户还有“赞”、“踩”、“不再推荐此类”等操作,具体公式还要视具体情况而定。另外,热度推荐、个性化推荐本身也会导致用户大量的点击。从而导致被推荐内容的越来越热的情况。所以公式的各项参数都需要不断调整,最好所有的调整指标都做成运营可调的形式。 -
拓展
上述是以新闻为例讲的热度算法的基本步骤流程,不同行业维度不同,热度公式自然不同。如果应用到电商,则可能推荐的维度是购买最多、最新款;如果应用到O2O餐饮,则可能推荐的是距离最近、评分最高、客流量最大。
2.3 如何做内容相关性的推荐
现在,内容产品顺利度过早期阶段,拥有了几万甚至十几万级别的阅读量,但会发现,热度算法导致用户的阅读内容过于集中,而个性化的内容却很少用户量,这时候需要做个性化推荐,让用户不仅能够读到大家都喜欢的内容,也能读到只有自己感兴趣的内容。
内容相关性的推荐主要解决途径有:
1.内容相似性算法
2.基于内容的协同过滤算法
这里以复杂度最高的新闻为例:
把新闻看作是所有关键词(标签)的合集,理论上,如果两个新闻的关键词越类似,那这两个新闻是相关内容的可能性更高。新闻特征向量是由新闻包含的所有关键词决定的,得到新闻特征向量的第一步,是要对新闻内容进行关键词级别的拆分。
内容相关性推荐算法思路是:将内容打标签——同类推荐,如果是新闻的话则需要分词,计算相似度步骤为:分词——计算关键词指标——算法定义——用户匹配
1、分词
分词需要两个词库:正常的分词词库和停用词库。分词词库用于分词,停用词库用于去掉非关键词。随着网络世界热词频出,标准词库和停用词库也需要不断更新和维护,可以在网上查找或购买那些能随时更新的词库。
2、关键词指标
内容相关性的推荐本质上是关键词相关性的推荐,定义一个关键词指标:TFIDF=TF*IDF。原理:一个关键词在某条新闻出现的频率越大,在所有文档中出现的频率越小,该关键词对这条新闻的特征标识作用越大。
3、算法定义
经过以上两步,每一篇新闻的特征就能用关键词的集合来标识了:
Word是关键词,tfidf是Word的权重,(Word,tfidf)是一个向量。两个新闻的相似度就能通过重合的关键词的tfidf值来衡量了。根据余弦定理,向量(WordA,tfidfA)和向量(WordB,tfidfB)的夹角越小,相似度越高。
假设两条新闻的特征列表如下:
可以看到两条新闻有5个重合的关键词:广州、摩拜单车、太阳、天河、市长,因此两条新闻的相关性由这5个关键词决定,计算方式如下:
S
i
m
i
l
a
r
i
t
y
=
cos
θ
=
A
⋅
B
∣
A
∣
×
∣
B
∣
=
∑
N
(
A
i
×
B
i
)
∑
N
(
A
i
)
2
×
∑
N
(
B
i
)
2
=
∑
k
=
1
N
x
1
k
x
2
k
∑
k
=
1
N
x
1
k
2
⋅
∑
k
=
1
5
x
2
k
2
Similarity=\cos\theta=\frac{A\cdot B}{|A|\times|B|}=\frac{\sum_{N}(A_{i}\times B_{i})}{\sqrt{\sum_{N}(A_{i})^2}\times\sqrt{\sum_{N}(B_{i})^2}}\\ =\frac{\sum_{k=1}^{N}x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^{N}x_{1k}^2}\cdot\sqrt{\sum_{k=1}^{5}x_{2k}^2}}
Similarity=cosθ=∣A∣×∣B∣A⋅B=∑N(Ai)2×∑N(Bi)2∑N(Ai×Bi)=∑k=1Nx1k2⋅∑k=15x2k2∑k=1Nx1kx2k
上例的相似度计算如下:
A
(
x
11
,
x
12
,
x
13
,
x
14
,
x
15
)
=
(
0.0009
,
0
,
0246
,
0.0253
,
0.0254
,
0.087
)
A(x_{11},x_{12},x_{13},x_{14},x_{15})=(0.0009,0,0246,0.0253,0.0254,0.087)
A(x11,x12,x13,x14,x15)=(0.0009,0,0246,0.0253,0.0254,0.087),
B
(
x
21
,
x
22
,
x
23
,
x
24
,
x
25
)
=
(
0.0027
,
0.0123
,
0.0092
,
0.0254
,
0.0261
)
B(x_{21},x_{22},x_{23},x_{24},x_{25})=(0.0027,0.0123,0.0092,0.0254,0.0261)
B(x21,x22,x23,x24,x25)=(0.0027,0.0123,0.0092,0.0254,0.0261)
S
i
m
i
l
a
r
i
t
y
=
cos
θ
=
∑
k
=
1
5
x
1
k
x
2
k
∑
k
=
1
5
x
1
k
2
⋅
∑
k
=
1
5
x
2
k
2
=
0.0009
×
0.0027
+
0.0246
×
0.0123
+
0.0253
×
0.0092
+
0.0254
×
0.0254
+
0.0087
×
0.0261
(
0.000
9
2
+
0.024
6
2
+
0.025
3
2
+
0.025
4
2
+
0.008
7
2
)
×
(
0.002
7
2
+
0.012
3
2
+
0.009
2
2
+
0.025
4
2
+
0.026
1
2
)
=
0.00141
0.0142408384952
=
0.0990110238575
≈
0.0990
Similarity=\cos \theta=\frac{\sum_{k=1}^{5}x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^{5}x_{1k}^2}\cdot\sqrt{\sum_{k=1}^{5}x_{2k}^2}}=\frac{0.0009\times0.0027+0.0246\times0.0123+0.0253\times0.0092+0.0254\times0.0254+0.0087\times0.0261}{\sqrt{(0.0009^2+0.0246^2+0.0253^2+0.0254^2+0.0087^2)}\times\sqrt{(0.0027^2+0.0123^2+0.0092^2+0.0254^2+0.0261^2)}}=\frac{0.00141}{0.0142408384952}=0.0990110238575\approx0.0990
Similarity=cosθ=∑k=15x1k2⋅∑k=15x2k2∑k=15x1kx2k=(0.00092+0.02462+0.02532+0.02542+0.00872)×(0.00272+0.01232+0.00922+0.02542+0.02612)0.0009×0.0027+0.0246×0.0123+0.0253×0.0092+0.0254×0.0254+0.0087×0.0261=0.01424083849520.00141=0.0990110238575≈0.0990
得出两条新闻的相关性最终值;用同样的方法能得出一条新闻与新闻库里面所有内容的相关性。
4、用户匹配
得到新闻特征以后,要做到将相关内容推荐给对该内容可能感兴趣的用户,还需要得到用户特征才能对两者进行匹配和推荐,获取用户特征需要通过用户的行为来获得,用户通过阅读,点赞,评论,分享等操作来表达自己对新闻内容的喜爱;跟热度排名类似,比如我们对用户的各种行为赋予一定的分值,如点击阅读1分,收藏2分,分享5分等,这样新闻特征与用户行为结合后,就能得到用户的特征分了。
参照热度算法中的用户交互热度分,可以做如下定义:
以上是内容推荐的实现方案,它不会受到用户数量的影响,仅取决于具体用户的操作,而且每个用户的推荐相互独立并不会相互影响。但是它推荐的内容都是由用户的阅读历史决定,所以没办法挖掘用户的潜在兴趣,没办法为用户带来惊喜。
5、优缺点:
优点:
对用户数量没有要求,因此个性化推荐早期一般采用这种方式;每个用户的特征都是由自己的行为来决定的,是独立存在的,不会有互相干扰,因此恶意刷阅读等新闻不会影响到推荐算法。
缺点:
确定性太强,所有推荐的内容都是由用户的阅读历史决定,所以没有办法挖掘用户潜在的兴趣,也就是由于这一点,基于内容的推荐一般与其他推荐算法无法同时存在。
2.4 如何做基于用户操作协同的推荐
基于内容的推荐算法有其独特的优势,但是不能给用户带来惊喜感,这就需要做基于用户的协同操作的推荐,主要解决途径有:
1、基于客户的协同过滤算法
2、根据用户偏好算法
基于客户的协同过滤算法简而言之就是找到相同喜好的人,实现“人以群分”,把内容推荐给有相同喜好的人,关键在于用户群体的划分,推荐内容的排序。
基于用户操作协同的推荐虽然能给人带来惊喜感,但对用户操作依赖性很高,实际运用中个性化推荐应该多种推荐方法同时使用。
1、如何用户群体划分
首先做用户划分,可以从以下三方面:
(1)借用第三方登录获取用户信息,即借用外部数据。比如通过微信、QQ、微博等登录,借用第三方账户有降低门槛、方便传播等好处,还能对个性化推荐起到重要作用,因为第三方账户都是授权获取部分用户信息的,包括性别、年龄、职业、甚至社交关系等等,这些信息对用户群划分很重要;此外还可以借用的数据比如IP地址、手机语种等,可以知道一个用户是上海的还是北京的,是大学生还是创业者,并依据这些属性做准确的大类的划分。
(2)产品首次启用时主动询问。常见的在产品首次启动时,会弹框询问用户是男是女、用户职业等,这些能够对内容推荐的冷启动提供一些帮助。但总体而言,性价比较低,只能询问两三个问题并对用户的推荐内容做的划分很粗略,同时产品要避免打扰到用户体验。这种做法算是基于用户个性化的雏形。
(3)根据用户操作总结经验给用户打标签。前面提到的,新闻特征加用户的阅读数据能得到用户的特征,就可以通过用户特征的相似性来划分群体。
2、如何根据用户操作总结经验给用户打标签
以下时通过一个实例来实践用户协同过滤的原理,包括如何计算用户之间的相似性和如何做出推荐。
对用户的操作进行赋值,比如阅读、点赞、收藏、评论、分享等操作,对这几种行为赋予的分数分别为1分、2分、3分、4分、5分,得出用户(阅读)特征向量,特征向量越接近,用户间的(阅读)喜好越接近。
例子:比如有A、B、C、D、E这5个用户,他们各自阅读了几篇新闻并做出了以上五种操作行为,这样,用户对每条新闻都有自己的得分,其中“-”表示未阅读,各用户对每条新闻的得分如下:
那么,我们接下来该给用户E推荐新闻4、5、6种的哪一篇呢?
用户的阅读特征向量由用户所有的阅读数据决定,以用户E阅读过的新闻数据作为参考标准,来找到与E最相似的用户。
五位用户的特征向量分别为:
根据欧几里得距离公式,计算向量距离:
得出他们之间的距离分别为:
d
i
s
t
a
n
c
e
(
E
,
A
)
=
(
1
−
5
)
2
+
(
2
−
3
)
2
≈
4.123
distance(E,A)=\sqrt{(1-5)^2+(2-3)^2}\approx4.123
distance(E,A)=(1−5)2+(2−3)2≈4.123(因为用户A没有阅读news2,所以news2的数据不能用来计算与用户E的相似度,这里取news1和news3)
d
i
s
t
a
n
c
e
(
E
,
B
)
=
(
1
−
1
)
2
+
(
4
−
3
)
2
+
(
2
−
5
)
2
≈
3.162
distance(E,B)=\sqrt{(1-1)^2+(4-3)^2+(2-5)^2}\approx3.162
distance(E,B)=(1−1)2+(4−3)2+(2−5)2≈3.162
d
i
s
t
a
n
c
e
(
E
,
C
)
=
(
1
−
4
)
2
+
(
4
−
5
)
2
+
(
2
−
4
)
2
≈
3.742
distance(E,C)=\sqrt{(1-4)^2+(4-5)^2+(2-4)^2}\approx3.742
distance(E,C)=(1−4)2+(4−5)2+(2−4)2≈3.742
d
i
s
t
a
n
c
e
(
E
,
D
)
=
(
1
−
2
)
2
+
(
4
−
4
)
2
+
(
2
−
3
)
2
≈
1.414
distance(E,D)=\sqrt{(1-2)^2+(4-4)^2+(2-3)^2}\approx1.414
distance(E,D)=(1−2)2+(4−4)2+(2−3)2≈1.414
所以,D和E的阅读爱好最接近,应该优先归为一类用户,所以应该优先把news4推荐给E。
3、如何进行推荐内容排序
通过阅读特征向量把用户做群体划分后,接下来就是如何获取新闻内容推荐的优先级。上面的例子里只需要选出一个最相似的用户,并且用户A,B,C,D都只阅读news4,news5,news6中的一条,所以情况比较简单,但在实际情况中,同一个用户群体阅读的新闻多且随机,用户交互更是错综复杂,那要如何得出推荐新闻的优先级别呢?
假设用户X在系统归属于群体A,这个群体有n个用户,分别为A0,A1,…,An,这些用户的集合用S(X,n)表示。
- 首先,需要把集合中所有用户交互过(阅读、评论等)的新闻提取出来;
- 需要剔除掉用户X已经看过的新闻,这些就不用再推荐了,剩下的新闻集合有m条,用N(X,m)来表示;
- 对余下的新闻进行评分和相似度加权的计算,计算包括两部分,一是用户X与S(X,n)每一个用户的相似性,二是每个用户对新闻集N(X,m)中每条新闻的喜好,这样就能得到每条新闻相对于用户X的最终得分;
- 将N(X,m)中的新闻列表按照得分高低的顺序推荐给用户。
4、优缺点
相比于基于内容的推荐算法,基于用户的协同过滤同样优缺点明显:
优点:对分词等算法精确度无太大要求,推荐都是基于用户的行为数据去不断学习和完善;同时能发现用户的潜在阅读兴趣。
缺点:启动的门槛高,用户量不够时几乎无法开展;并且学习量不够时推荐结果较差。