来源:http://blog.csdn.net/Snail_Moved_Slowly/article/details/79255491
http://blog.csdn.net/Real_Myth/article/details/48974853
其实这只能算是一个总结,一个读后感外带一点引申。《基于用户投票的排名算法》系列,作者:阮一峰。这个系列的文章确实写得很漂亮,层层深入,引人思考。作者blog:
http://www.ruanyifeng.com/blog/
1. 只有赞成票
(1)单位时间内用户的投票数进行排名Delicious。
实现:每小时统计一次次数,高的在前。
优点:简单,确实能反映热度。
缺点:不够平滑;热门内容可能一直在前。
(2)时间衰减投票数Hack news
实现:P为投票数,T为时间,G为衰减因子。
优点:有淘汰策略
缺点:只能处理好评。
2. 赞成和反对差额(Reddit的热点文章)
实现:z为赞成-反对,y为赞成>反对?1:-1
优点:考虑到赞成和反对的行为,而且根据时间衰减,
缺点:基本上由发帖时间决定,超级受欢迎的文章会排在最前面,一般性受欢迎的文章、有争议的文章都不会很靠前。
3.参与度、质量、时间。StackOverflow
实现:Qviews浏览量、Qscore(问题得分)、Qanswers(回答的数量)、Ascores(回答得分)、Qage(距离问题发表的时间)、Qupdated(距离最后一个回答的时间)
优点:根据实际需要,综合了数量、质量和热度。
缺点:Ascores只是简单的相加,有可能淹没一个特别好的答案的权重。
4. 牛顿冷却定律
其实,就是按时间衰减的定律。
5. 威尔逊区间(Reddit的评论排名,目前就使用这个算法。)
实现:p表示样本的"赞成票比例",n表示样本的大小,表Z1-a/2示对应某个置信水平的z统计量。(此公式)如果n非常小,下限值会大大小于p。
优点:解决了投票人数过少、导致结果不可信的问题。
缺点:排行榜前列总是那些票数最多的项目,新项目或者冷门的项目,很难有出头机会。
6.贝叶斯平均(IMBD)
实现:c每个项目的平均投票数,m总体平均分,x每张选票的值,n投票人数
优点:引入先验概率,每一次新的投票都是一个调整因子,使总体平均分不断向该项目的真实投票结果靠近。使得数量因素变得平均,影响变小。(数量用时间来衰减呢?前面都用到了,时间衰减使得数量增长的影响变得越来越小)
缺点:假设用户的投票是正态分布,无法凸显debate。
总上所述:
很显然看似简单的问题其实有很多因素进行影响,当然针对自己的项目还要进行相应处理,不同的因素权重不同必然导致结果有所偏重。