在计算维基百科趋势的Hadoop教程hive_trend_mapper.py
程序中使用的公式背后的基本原理是什么?
实际上有两个组成部分:月度趋势和每日趋势.我将专注于日常趋势,但类似的问题适用于每月的趋势.
在每日趋势中,pageviews
是此主题每天的页面查看数量的数组,每天一个元素,并且total_pageviews
是此数组的总和:
# pageviews for most recent day y2 = pageviews[-1] # pageviews for previous day y1 = pageviews[-2] # Simple baseline trend algorithm slope = y2 - y1 trend = slope * log(1.0 +int(total_pageviews)) error = 1.0/sqrt(int(total_pageviews)) return trend, error
我知道它在表面上做了什么:它只是查看过去一天的变化(slope
),并将其扩展到日志1+total_pageviews
(log(1)==0
,因此这个缩放因子是非负的).它可以看作是将月份的总浏览量视为一个权重,但随着它的增长而缓和 - 这样,总浏览量不再对"足够受欢迎"的内容产生影响,但同时对无关紧要的内容进行了重大改变. t尽可能地称重.
但为什么这样呢?为什么我们想要打折最初不受欢迎的东西?对于那些持续受欢迎程度较低的项目而言,大三角洲不应该更重要,而对于那些已经很受欢迎的项目(大三角洲可能落在标准偏差的一小部分内)来说,不应该更少吗?作为一个稻草人,为什么不简单地采取y2-y1
和完成它?
什么error
会有用?该教程并没有真正有意义地再次使用它.然后,它没有告诉我们如何trend
使用 - 这是在最终产品中绘制的,对吗?
我在哪里可以读到关于理论的(最好是介绍性的)背景?有这个疯狂的名字吗?这是一个教科书公式吗?
提前感谢任何答案(或讨论!).
正如在线评论所说,这是一个简单的"基线趋势算法",它基本上意味着在比较两个不同页面的趋势之前,您必须建立一个基线.在许多情况下,使用平均值,如果您根据时间轴绘制综合浏览量,则可以直接使用.该方法广泛用于监测水质,空气污染物等,以检测基线的任何显着变化.
在OP的情况下,浏览量的斜率由总页面浏览量的日志加权.此sorta使用totalpageviews作为斜率的基线校正.正如Simon所说,这会在两个页面之间取得平衡,页面总页面浏览量会有很大差异.例如,A的总浏览量超过1000,000的斜率500,B超过1,000的1000.日志基本上意味着1000,000只比1,000(而不是1000次)重要两倍.如果你只考虑斜率,A比B更不受欢迎.但是对于权重,现在衡量A的流行程度与B相同.我认为它非常直观:虽然A的网页浏览量只有500次网页浏览量,但那是因为它是饱和的,你仍然要给它足够的信誉.
至于错误,我认为它来自(相对)标准误差,其具有因子1/sqrt(n),其中n是数据点的数量.在代码中,错误等于(1/sqrt(n))*(1/sqrt(mean)).它大致转化为:数据点越多,趋势越准确.我不认为它是一个精确的数学公式,只是一个粗暴的趋势分析算法,无论如何相对值在这个背景下更重要.
总之,我认为这只是一个经验公式.在一些生物统计学教科书中可以找到更高级的主题(非常类似于监测流感的爆发等).