本来做这个YT活跃度只是为了动态地自动调控经济水平,不过后来发现把活跃度数据公布出来也不错,于是就继续做了个SVG。
下面简单描述下YT活跃度的计算模型。
(照例先放上文档)
YT活跃度计算模型说明.uof
YT活跃度计算模型说明.pdf
YT已经运行了4年,已经积累了大量的日发帖数据,这是活跃度计算模型中的一个重要参数。另一个重要参数是页面浏览,这里的页面浏览仅指帖子浏览和帖子列表浏览,其他地方的页面浏览不算。
确定了这两个参数以后,我开始观察这两个数据的变化情况。帖子浏览数据是前不久才开始记录的,到现在并没有太多的记录,大约只有20天的记录,不过这20天的记录也已经够了。在我观察后发现,帖子浏览的数据大体上是发帖数的10倍,为了能让两个参数都能尽可能地影响活跃度,我最后把每一天的活跃度定义为:
H = T + Y / 10
其中,各个字母代表的是:
H:活跃度
T:日发帖数
Y:日浏览数
活跃度计算方法很容易确定,但是接下来的事情就没这么好办了。
我的主要目的是要动态自动调控经济水平,因此我在每一天的开始就能知道这一天的活跃度是多少,接着把今天的活跃度与昨天的活跃度进行比较,再对今天的经济水平进行调整。
今天的日发帖数和日浏览数在“今天”没有结束之前是不可能知道的,既然不可能知道那就只能预测了,说道预测自然而然就想到线性回归。于是,最初的设想就是利用线性回归来预测本日的发帖数以及浏览数,最后计算出本日的活跃度。
线性回归是容易计算,但是就YT的实际情况来说,这里有一个问题。YT的发帖量在工作日和双休日反差很大,双休日发帖数多,而工作日发帖数少,造成这用情况的原因是YT的用户大多数是学生。在这种情况下,如果直接使用线性回归,预测结果与实际肯定会有较大出入,为了解决这个问题,我设想了下面的方法:
给每一天的每一个参量(发帖数或页面浏览数)设定两个分量,其中一个是根据线性回归模计算出来的本日的参量,另一个是参量的实际值与预测值的偏差数。同时,规定工作日的偏差数为0,仅认为双休日才会出现较大的偏差(偏差量较小就不考虑)。
首先计算预测值。根据上面的方法,在计算预测值的时候就是假设双休日和工作日的发帖水平是相近的,也就是忽略了双休日由于不用上课而多出来的那些帖子数和页面浏览。这样子,线性回归样本的采集就应该是这样:如果样本数据是工作日,则取其实际发帖数,如果是双休日,则取其预测值。
为了修正双休日的预测值误差,就要计算双休日的偏移数。因为要预测本日的活跃度,那么双休日的偏移数当然也要进行预测。YT已经积累了不少的数据,以前的数据可以用实际值减去预测值得出。在进行本日的活跃度预测时,本日的偏移值就不能直接得出,而必须也进行预测。本来这个偏移值的变化不大,可以很简单地使用取平均数的方法进行预测,但考虑到放假时间和开学时间发帖数和页面浏览也会有很大不同,为了在放假初期和开学初期能较及时的反映出活跃度的变化,我再次选择了线性回归而不是取平均数。确定了预测方法之后的过程就比较简单了,只要取得本日之前的几个双休日的偏移值(这是由实际值减去预测值得到的),就可以作为预测的基本数据。
自此,活跃度模型基本上就做出来了,接下来要做的是,利用YT大量的历史记录对这个模型进行检验,看看它的偏差是否能够被接受。
接着我就这么做了,但是结果很令人失望,预测值与实际值相差过大了,我不得不寻找导致误差过大的原因并对模型进行修改。
找原因和修改的过程是很痛苦的,期间我都记不清楚我尝试了多少种模型,进行了多少次怎么样的修改。不过主要的修改和尝试我还是记得的,下面就简单说说。
在使用纯线性回归得到结果以后,首先发现的一个最大问题就是,有部分预测值出现了负数。在进行模型建立的时候我倒没想到这个问题,不过在发现以后倒也觉得这是正常的。如果发帖数日趋下滑,比如由双休日到工作日的过度,线性回归的那条直线斜率是负的,预测下一天的数据出现负数自然就不奇怪了。当然实际中是不可能出现负值的,所以我把所有的负值都改为0。
仅仅解决了负数问题还不行,预测值误差仍然没有得到解决。在我观察之后发现这是因为每一天的参数变化跳跃太大了,两天之间的参数相差大的时候可以相差好几倍,这就是导致预测值脱离实际的根本原因。这时候我想,既然参数跳跃太大,那么能不能改用取平均数的方法进行预测?
想到这点以后我就抛弃线性回归计算而采用平均值进行计算,不过遗憾的是,使用平均值预测的结果看起来似乎是比线性回归更符合实际,但是预测值反应太慢了,跟不上实际情况的变化,或者说,预测值的跳跃太小了,无法在实际值有大跳跃的时候反应实际值。
最后想到了一个办法,综合使用线性回归和平均数进行计算。在几次尝试以后,我确定了这样的计算方法,取线性回归预测结果的75%和平均数预测结果的25%作为最终预测结果。根据这个计算方法预测出来的结果我看过之后,感觉比较满意了,在YT这种参数跳变很大的地方能得到这样的预测结果已经是很不错的了。
现在我已经将这个方法应用到了YT,并且也做好了用SVG输出活跃度的图表。其实由于日浏览数据还不够多,在进行预测的时候偏差很大,所以现在总的活跃度还是不太准确的。预计再过一个月左右,日浏览数据足够多以后应该就能做到比较准确的预测了。
最后附上到2008年3月10日为止的部分预期数据,其中偏差值的999是无效的,那是我自己修改数据库里面的值来标记双休日的。
| 日期 | 实际发帖 | 预期发帖 | 偏差值 |
| 2008-3-1 | 671 | 402 | 999 |
| 2008-3-2 | 433 | 404 | 999 |
| 2008-3-3 | 139 | 413 | 0 |
| 2008-3-4 | 89 | 360 | 0 |
| 2008-3-5 | 197 | 298 | 0 |
| 2008-3-6 | 163 | 266 | 0 |
| 2008-3-7 | 209 | 235 | 0 |
| 2008-3-8 | 197 | 215 | 999 |
| 2008-3-9 | 320 | 164 | 158 |
| 2008-3-10 | <NULL> | 204 | 0 |
表格 1 截止到3月10日的YT部分发帖预测数与实发帖数
F-22's Trace
greensea 的个人主页
sky-city
极夜奁
小樱之町