—— 桂林 2011-05-02
人的口味每天在变,旧的评价不一定准确。比如一部老片,一直评分不高,有5000个3星评分。最近由于新闻或流行趋势的影响,评价改变了,新增了500个5星评分。但历史评价的数量多,新评价不足以对总评分有决定性的影响,所以需要一套算法来增加新评分的权重,以更准确的表达评价。
方案1:周期递推衰减
方案2:实时衰减
根据方案1
ratio函数根据last_update_time的时间来计算衰减率。
如: last_update_time 是 1分钟前,返回 0.999
1天前 返回 0.95
1周前 返回 0.9
1月前 返回 0.85
1年前 返回 0.7
方案3: 汇总衰减
半衰期。类似于放射性物质的半衰期,半衰期是一个常量,我们可以设定半衰期为1年,则 ratio(now - 1year) = 0.5, ratio(now - 2year) = 0.25, ratio(now-3year) = 0.125
我们可以得出以下ratio函数
人的口味每天在变,旧的评价不一定准确。比如一部老片,一直评分不高,有5000个3星评分。最近由于新闻或流行趋势的影响,评价改变了,新增了500个5星评分。但历史评价的数量多,新评价不足以对总评分有决定性的影响,所以需要一套算法来增加新评分的权重,以更准确的表达评价。
方案1:周期递推衰减
sum_rate = Sum(pending_rate) + last_sum_rate * 0.8
count_rate += count(pending_rate) + last_count_rate * 0.8
rate = sum_rate / count_rate
//once a period
last_sum_rate = sum_rate
last_rate = rate
方案2:实时衰减
根据方案1
// on rate
sum_rate = rate + sum_rate* ratio(last_update_time)
count_rate = 1 + count_rate * ratio(last_update_time)
rate = count_rate / sum_rate
last_update_time = now
ratio函数根据last_update_time的时间来计算衰减率。
如: last_update_time 是 1分钟前,返回 0.999
1天前 返回 0.95
1周前 返回 0.9
1月前 返回 0.85
1年前 返回 0.7
方案3: 汇总衰减
sum_rate = SUM(rate)(rate * ratio(last_update_time))
counte_rate = SUM(rate)(1 * ratio(last_update_time))
半衰期。类似于放射性物质的半衰期,半衰期是一个常量,我们可以设定半衰期为1年,则 ratio(now - 1year) = 0.5, ratio(now - 2year) = 0.25, ratio(now-3year) = 0.125
我们可以得出以下ratio函数
var half = 1year;
ratio = function(date)
delta = now - date
return 0.5 power (delta/half)