s0算法
① 关于热度算法
热度算法基本原理
需要了解的是,热度算法也是需要不断优化去完善的,基本原理:
新闻热度分 = 初始热度分 + 用户交互产生的热度分 – 随时间衰减的热度分
Score = S0 + S(Users) – S(Time)
新闻入库后,系统为之赋予一个初始热度值,该新闻就进入了推荐列表进行排序;随着新闻不断被用户点击阅读,收藏,分享等,这些用户行为被视作帮助新闻提升热度,系统需要为每一种新闻赋予热度值;同时,新闻是有较强时效性的内容,因此新闻发布之后,热度必须随着新闻变得陈旧而衰减。
新闻的热度就在这些算法的综合作用下不断变化,推荐列表的排序也就不断变化。
初始热度不应该一致
上面的算法为每一条入库的新闻赋予了同样的热度值,但在现实使用后发现行不通,例如娱乐类别比文化类别受欢迎程度本身就高很多;或者突发了严重的灾害或事故;或是奥运会期间,体育类别的关注度突然高了起来;而此时如果还是每条新闻给同样的热度就不能贴合实际了。
解决办法就是把初始热度设置为变量:
(1)按照新闻类别给予新闻不同的初始热度,让用户关注度高的类别获得更高的初始热度分,从而获得更多的曝光,例如:
(2)对于重大事件的报道,如何让它入库时就有更高的热度,我们采用的是热词匹配的方式。
即对大型新闻站点的头条,Twitter热点,竞品的头条做监控和扒取,并将这批新闻的关键词维护到热词库并保持更新;每条新闻入库的时候,让新闻的关键词去匹配热词库,匹配度越高,就有越高的初始热度分。
这样处理后,重大事件发生时,Twitter和门户网站的争相报道会导致热词集中化,所有匹配到这些热词的新闻,即报道同样事件的新闻,会获得很高的初始热度分。
用户行为分规则不是固定不变的
解决了新闻入库的初始分之后,接下来是新闻热度分的变化。先要明确用户的的哪些行为会提高新闻的热度值,然后对这些行为赋予一定的得分规则。例如对于单条新闻,用户可以点击阅读(click),收藏(favor),分享(share),评论(comment)这四种行为,我们为不同的行为赋予分数,就能得到新闻的实时用户行为分为:
S(Users) = 1*click + 5*favor + 10*comment + 20*share
这里对不同行为赋予的分数为1,5,10,20,但这个值不能是一成不变的;当用户规模小的时候,各项事件都小,此时需要提高每个事件的行为分来提升用户行为的影响力;当用户规模变大时,行为分也应该慢慢降低,因此做内容运营时,应该对行为分不断调整。
当然也有偷懒的办法,那就是把用户规模考虑进去,算固定用户数的行为分,即:
S(Users) = (1*click + 5*favor + 10*comment + 20*share)/DAU * N(固定数)
这样就保证了在不同用户规模下,用户行为产生的行为分基本稳定。
热度随时间的衰减不是线性的
由于新闻的强时效性,已经发布的新闻的热度值必须随着时间流逝而衰减,并且趋势应该是衰减越来越快,直至趋近于零热度。换句话说,如果一条新闻要一直处于很靠前的位置,随着时间的推移它必须要有越来越多的用户来维持。
我们要求推荐给用户的新闻必须是24h以内,所以理论上讲,衰减算法必须保证在24h后新闻的热度一定会衰减到很低,如果是线性衰减,当某些新闻突然有大量用户阅读,获得很高的热度分时,可能会持续排名靠前很久,让用户觉得内容更新过慢。
参考牛顿冷却定律,时间衰减因子应该是一个类似于指数函数:
T(Time) = e ^ (k*(T1 – T0))
其中T0是新闻发布时间,T1是当前时间。
而由于热度的发展最终是一个无限趋近于零热度的结果,最终的新闻的热度算法也调整为:
Score = ( S0(Type) + S(Users) ) / T(Time)
其他影响因素
很多新闻产品会给用户“赞”,“踩”或“不在推荐此类”的选项,这些功能不仅适用于个性化推荐,对热度算法也有一定的作用。
新闻的推送会造成大量的打开,在计算热度的时候需要排除掉相关的影响。类似于这样的因素,都会对热度算法产生影响,因此热度算法上线后,依然需要不断地“调教”。建议把所有的调整指标做成可配项,例如初始热度分,行为事件分,衰减因子等,从而让产品和运营能实时调整和验证效果,达到最佳状态。
② 数学建模常用算法——传染病模型(三)SIR模型
常见的传染病模型按照具体的传染病的特点可分为SI、SIS、SIR、SIRS、SEIR模型。其中“S”“E”“I”“R”的现实含义如下:
“S”代表易感者,指的是缺乏免疫能力的健康人,与感染者接触后容易受到感染;
“E”代表暴露者,指接触过感染者但暂无传染性的人,适用于存在潜伏期的传染病;
“I”代表患病者,指有传染性的病人,可以传播给S,将其变为E或I;
“R”代表康复者,指病愈后具有免疫力的人,对于终身免疫性传染病,康复者不可被重新变为S、E或I;在免疫期有限的传染病中,康复者可能重新变为S类,从而再次被感染。
SIR模型适用于有易感者、患病者和康复者三类人群的传染病,如水痘,康复者具有很强的免疫力,不会再次感染。对于致死性传染病,死亡的病人也可以归类为康复者,理解为退出了传染系统。
模型假设如下:
- 易感者与患病者有效接触即被感染,变为患病者,可以被治愈变为康复者,无潜伏期,有终身免疫力。
- 以一天作为模型的最小时间单位。
- 总人数为N,不考虑人口的出生与死亡、迁入与迁出,此总人数不变。
- t时刻各类人群占总人数的比率分别记为s(t)、i(t)、r(t),各类人群的数量为S(t)、I(t)、R(t)。
- 初始时刻t=0时,各类人数量所占初始比率为s0、i0、r0。
- 日接触数λ,即每个患病者每天有效接触的易感者的平均人数。
- 日治愈率μ,即每天被治愈的患病者人数占病人总数的比率。
- 平均治愈天数为1/μ,即从患病到治愈的天数。
- 传染期接触数σ=λ/μ,即每个患病者在整个传染期1/μ天内,有效接触的易感者人数。
- 根据模型假设:
每个病人每天可使λ*s(t)个易感者变为患病者,患病者人数为N*i(t),所以每天有λ*s(t)*N*i(t)个易感者被感染,即每天新增的患病者数。每天的患病人数N*i(t)中,又有μ*N*i(t)被治愈成为康复者。
由此可以得到微分方程:
N*ds(t)/dt=-λ*s(t)*N*i(t)
N*di(t)/dt=λ*s(t)*N*i(t)-μ*N*i(t)
N*dr(t)/dt=μ*N*i(t)
简化后得:
ds(t)/dt=-λ*s(t)*i(t)
di(t)/dt=λ*s(t)*i(t)-μ*i(t)
dr(t)/dt=μ*i(t)
s(0)=s0
i(0)=i0
r(0)=0
因为s(t)+i(t)+r(t)=1,且观察上式可得:
dr(t)/dt=-(ds(t)/dt+di(t)/dt)
去除恒等式dr(t)/dt=-(ds(t)/dt+di(t)/dt)=μ*i(t),模型简化为:
ds(t)/dt=-λ*s(t)*i(t)
di(t)/dt=λ*s(t)*i(t)-μ*i(t)
s(0)=s0
i(0)=i0
此模型无解析解,给定λ、μ、s0、i0可求数值解。
随着时间推移,易感者数s(t)开始单调递减,患病者数比率i(t)先达到峰值,随后一直回落,直到减为零,康复者数单调递增。
若σ>1,则最终全部为康复者。
若σ≤1,则会剩余一部分易感者,而疾病波及到的总人数为t趋于无穷大时的康复者人数R(t)。