数值指数衰减

标签值衰减

在用户画像里, 经常会用到衰减这个功能.
比如几个月前的行为计算出来的兴趣分值需要随时间衰减, 让近期的兴趣分值有机会排在前面, 更好的反映最近的兴趣偏好等.

常用的衰减方法可以选线性衰减或者是非线性的.
线性衰减, 最简单的就是一条递减直线, 直接把标签分值乘以一个常数系数.
非线性的, 例如 Exponential decay(指数式衰减):

指数衰减

指数衰减的公式如下:
https://zh.wikipedia.org/wiki/File:Plot-exponential-decay.png

其中, N0为初始值, t表示时间单位, N(t) 为t时刻的值, λ 是衰减系数.

那么如何用这个指数衰减公式呢 ?

假设我们有一个标签值为1, 我们想要180天后衰减到 0.001, 分值是一天更新一次, 那么:
N0 = 1, t = 180, N(180) = 0.001, 代入公式:

求得 λ = math.log(0.001/1)/(-180) = 0.0383

得到 λ 后就可以计算 t 天对应的分值了.

比如, t=1 的衰减后分值为:

>>> 1*(math.e**(-0.0383*1))
0.9624241703266826

画图得到曲线:

参考


牛顿冷却定律 - 阮一峰的网络日志
http://www.evanmiller.org/rank-hotness-with-newtons-law-of-cooling.html