博客园排名预测如何通过实现?

摘要:基于 gnuplot 函数拟合功能做的排名预测图,通过对比三种拟合函数的准确度,从中挑选出最适合的预测曲线
前言 之前写过一篇绘制博客园积分与排名趋势图的文章——《查看博客园积分与排名趋势图的工具 》,使用那篇文章介绍的工具,可以通过趋势图直观的看出排名前进的走势。但是如果想看看自己积分达到多少才能进入前多少名次,就无能为力了。如果我们能够根据历史数据,拟合出一条预测曲线,然后根据这条曲线就可以预测多少积分进多少排名啦!想想就很激动呐~ 积分-排名曲线 在开始拟合数据之前,我们先看下现在的趋势图: 它的横轴是时间轴,两条纵轴分别是积分与排名。虽然积分总是增长、排名大体是下降趋势,但是这个趋势我试了几种方法都不太好拟合,感觉没什么规律,特别受发表文章时机的影响:如果每天发一篇,这个曲线肯定增长的快;如果一年也不发,增长的肯定慢。我们的预测其实和时间没有什么关系,主要自变量是积分,因变量是排名。那么是否可以做一张图,横轴是积分,纵轴是排名呢?于是就有了下面的改进: 这下清爽多了,可以看到,虽然发表文章时积分会快速增长从而在横轴留下一些空白,但是总的来看积分与排名相对趋势是维持在一条曲线上的。想要绘制这样一条曲线,gnuplot 脚本改动并不大: 1 #! /usr/bin/gnuplot 2 set terminal png size 1080,720 #建立空白图片 3 set title usr.": score (".y1range.") rank (".y2range.")" #注明曲线图标题 4 set output "fit.png" #设置文件名 5 set key left 6 set grid 7 8 set xlabel "score" 9 set ylabel "rank" 10 11 #plot "score.txt" using 1:2 with lp pt 13 title "score" axis x1y1, "score.txt" using 1:3 with lp pt 3 title "rank" axis x1y2 12 plot "score.txt" using 2:3 with lp pt 13 title "score-rank" 13 14 quit #退出软件 就是将 line 11 换成 line 12,再去掉一些冗余代码就可以了。 数据拟合 有了历史数据和正确的映射关系,就可以进行数据拟合了。数据拟合最重要的是找到拟合函数,第一眼看到上面那条曲线我想到的就是二次函数,可以用抛物线的一段来进行拟合。此外随着积分的无限增大,排名最终会无限贴进于 1,这个特性让我想到了很多无限贴进某个值的函数,例如倒数函数无限贴进于 0,对数函数的反函数无限贴近于 0,还有反正切函数也是如此。最近刚刚高考结束,相信大家对高中数学已经忘了个七七八八,还好我这里准备了几张图: 从左到右依次是倒数、对数、反正切(atan),对于后两者,还需要加工一下才能满足我们的要求,具体罗列如下: f1(x)=a*x^2+b*x+c f2(x)=f/x+g f3(x)=j*atan(x)+k f4(x)=m*log(x)+n 分别就是它们四个啦,为了之后区分参数方便,使用了不同的参数名称。有的人可能会问了,这个对数是无限趋近于无穷大的,怎么能和上面的曲线拟合在一起呢?反正切也存在类似的问题,先别着急,让我们看下拟合结果就知道了。 嘿,这样居然也行,四条曲线竟然都能拟合上。
阅读全文