作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
概要
正如Ted Jaspers明智地指出的那样,我在2012年的原始提案中描述的方法实际上是exponential moving average的特例。这种方法的优点在于可以递归计算,这意味着您只需要为每个对象存储一个流行度值,然后可以在事件发生时递归地调整该值。无需记录每个事件。
这个单一的流行度值表示所有过去的事件(在所使用的数据类型的限制内),但是随着新事件的加入,较旧的事件对指数的影响减小。此算法将适应不同的时间范围,并响应变化的流量。每次发生事件时,都可以使用以下公式计算新的流行度值:(a * t) + ((1 - a) * p)
a
—介于0和1之间的系数(较高的值使较早的事件更快地折扣)t
—当前时间戳p
-当前的流行度值(例如,存储在数据库中)a
的合理值将取决于您的应用程序。一个好的起点是
a=2/(N+1)
,其中
N
是应该显着影响结果的事件数。例如,在事件为页面浏览量的低流量网站上,您可能会期望在几天内获得数百次页面浏览量。选择
N=100
(
a≈0.02
)是一个合理的选择。对于流量较高的网站,您可能会期望在几天内获得数百万的页面浏览量,在这种情况下,
N=1000000
(
a≈0.000002
)会更合理。
a
的值可能需要随时间逐渐调整。
{% set popularity = (0.02 * date().timestamp) + (0.98 * entry.popularity) %}
{% do entry.setFieldValue("popularity", popularity) %}
p = (p + t) / 2
microtime()
函数。否则,将使用标准的UNIX时间戳,例如PHP
time()
函数。
最佳答案
提出的算法是一种很好的方法,并且是Exponential Moving Average的特殊情况,其中alpha = 0.5:
p = alpha*p + (1-alpha)*t = 0.5*p + 0.5*t = (p+t)/2 //(for alpha = 0.5)
关于algorithm - 简单普及算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128086/
我是一名优秀的程序员,十分优秀!