2012年5月18日星期五

妙用随机函数

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-5-14 通过 白杨 baiyang 作者:baiyang

之前看到阮一峰的文章的排名算法,突然想到之前看的社交网络中facebook的创始人因为失恋,而恶意搞他们学校的女生时,用的排名算法正就是其中的一种。其实在看后这些简单的数学公式之后,觉得并不是什么高深的知识,就是平时所学的东西,只是连我们平时都不知道怎么用。

最近做一个系统,也要为用户推送文章,也正是用了其中的一种的算法。不过,后面我们发现,对于频繁更新的feed源,他们的文章始终排在前面【因为考虑了时间】,比如CSDN的系统,每隔几分钟就有一篇博文,然后我同学说,推送的文章的全都是CSDN的,而且几乎都是代码,代码,这样不好吧。我也开始想用什么方法,去解决这个问题,但是又不能太特殊。【channel_id是推送文章的源id号】

起初,最原始的想法就是限制每个feed源的推送数量,但是我觉得这样推频繁更新的Feed源太不公平了,因为对于一个频繁更新的源,可能总是只有前面几篇文章被推送给用户,不公平啊。然后自然又想到了另一个方法,就是对于每一个feed的文章排序【这样就可以随即调整该feed里的文章的顺序了】,然后再限制每一个feed的推送数量。但是总是感觉这些方法,有点麻烦,而且没有随机性。

这时,想到了之前的一篇博文,然后就借助抖动的思想,给了这些文章排名加入了抖动。效果果然比较好,效果如下

这样一看,对于每一个有更新的feed,我们都能公平给它机会展示他们的新作,而且对于产生的排名看,没有人工的干预和特殊处理。

当然,我觉得抖动这种思想应该可以更加的发挥好,但我只是设计了简单的随机函数,希望你能设计好的随机函数。

当然,这里的随即函数有以下要求:因为文章的排名算法,我们有的功能,所以,按理说,这些赞过的文章应该排名靠前,所以我们在加入抖动的贡献值,不能超过赞一次的分数。比如在我们的系统中,我们赞一次,对文章的贡献的是1分,所以,在抖动时,我们的最大贡献值不能超过1分。

下面是随机函数:

import random  def random_desc(start, high):     while True:         if random.randint(0, 100) % 3 == 0:             start += random.random()         else:             start -= random.random()         if start > high:             continue         yield start

它产生的效果如下:

你会发现,我们对同一个feed里文章用此函数进行抖动后,会有以下现象,我们允许局部递增,这时对于同一个feed源里的文章就不是严格意义上的按时间排序,也就是说,他们都有被推送在前面的可能;但是,对于同一个feed整体来说,我们需要它递减【贡献的分数是负数】,这样我们就可以限制同一个feed里推送文章的数量。

当然,这些小技巧其实不是什么大思想,也没有解决什么大问题,但是我觉得这种抖动的思想确实不错。


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论