刚进公司没多久,就到一个任务,任务的要求是:对公司主打APP的UV进行预测,就是实时的预测出当日UV用户比昨天增加或者减少的用户数;该任务的刚开始就卡住了,因为公司实时UV受推送影响很大,而且推送条数和时间都不固定,如何消除推送造成的影响呢?以下是我最终的解决方案,最终预测的准确性还是很高的~

我的方法需要2个前提如下:

1、昨日的实时累计UV,精确到分钟就可以;一天1440分钟,就是截止到每一分钟的累计用户数,以2015-01-01号为例,就是需要昨天2014-12-31 00:00:00~2014-12-31 23:59:00 每一分钟的累计用户数,这个是基础数据;

  ps:该业务可以使用redis,每分钟把上一分钟的UID入到redis中并计数(把UID作为key值,就相当于自动排重了),这样每一分钟的累计用户就都有了。

2、当天00:00:00~当前时间每一分钟的累计UV。

以上两个数据是预测的基础,当然还可以加入其调节的因素,这个就根据业务不同具体对待了。

设:当天每分钟累计用户序列为:UV1、UV2.......UVn (由于一天只有1440分钟,所以n<1440)

设:前一天每分钟累计用户序列为:UV_1、UV_2.......UV_n (n<1440)

然后把对应时间的累计UV做差,(UV1 - UV_1)、(UV2 - UV_2)、(UV3 - UV_3)....(UVn - UV_n)。

然后把时间(单位:分钟)作为横坐标,做差得出的结果作为纵坐标画出图形:

观察图形可以很直观的看到图形中有很多大起大落的拐点,这些大的拐点个数就是截止到当前推送的条数,为啥会有拐点呢,是因为每天推送的时间不一样才造成的图中的现象;然而推送引来的用户是由持续性的,推送的影响基本在30~40分钟以后才会逐渐平缓。

那拐点代表什么呢?  代表临近两次推送最真实的累计用户差别。

 

理解了上面的过程,利用下面的公式:

  预测UV = {sum([所有波谷的数值]) + 当时刻前UV的差值}/{len([所有波谷的数值]) + 1}

这样一个基本预测算法就能写出来了。

一下给出一个实时的预测结果趋势图:

红色箭头线代表了一听真实的UV变化值,图中可以看出蓝色线一天中所预测的UV变化非常接近真实值,其中可根据具体业务加入了其他预测因素。

 

posted on 2015-02-09 18:36  闪电战  阅读(630)  评论(0)    收藏  举报