基于用户投票的排名算法(一):Delicious和Hacker
日期:?2012年2月24日
互聯(lián)網(wǎng)的出現(xiàn),意味著"信息大爆炸"。
用戶擔(dān)心的,不再是信息太少,而是信息太多。如何從大量信息之中,快速有效地找出最重要的內(nèi)容,成了互聯(lián)網(wǎng)的一大核心問題。
各種各樣的排名算法,是目前過濾信息的主要手段之一。對(duì)信息進(jìn)行排名,意味著將信息按照重要性依次排列,并且及時(shí)進(jìn)行更新。排列的依據(jù),可以基于信息本身的特征,也可以基于用戶的投票,即讓用戶決定,什么樣的信息可以排在第一位。
下面,我將整理和分析一些基于用戶投票的排名算法,打算分成六個(gè)部分連載,今天是第一篇。
一、Delicious
最直覺、最簡單的算法,莫過于按照單位時(shí)間內(nèi)用戶的投票數(shù)進(jìn)行排名。得票最多的項(xiàng)目,自然就排在第一位。
舊版的Delicious,有一個(gè)"熱門書簽排行榜",就是這樣統(tǒng)計(jì)出來的。
它按照"過去60分鐘內(nèi)被收藏的次數(shù)"進(jìn)行排名。每過60分鐘,就統(tǒng)計(jì)一次。
這個(gè)算法的優(yōu)點(diǎn)是比較簡單、容易部署、內(nèi)容更新相當(dāng)快;缺點(diǎn)是,一方面,排名變化不夠平滑,前一個(gè)小時(shí)還排名靠前的內(nèi)容,往往第二個(gè)小時(shí)就一落千丈,另一方面,缺乏自動(dòng)淘汰舊項(xiàng)目的機(jī)制,某些熱門內(nèi)容可能會(huì)長期占據(jù)排行榜前列。
二、Hacker News
Hacker News是一個(gè)網(wǎng)絡(luò)社區(qū),可以張貼鏈接,或者討論某個(gè)主題。
每個(gè)帖子前面有一個(gè)向上的三角形,如果你覺得這個(gè)內(nèi)容很好,就點(diǎn)擊一下,投上一票。根據(jù)得票數(shù),系統(tǒng)自動(dòng)統(tǒng)計(jì)出熱門文章排行榜。但是,并非得票最多的文章排在第一位,還要考慮時(shí)間因素,新文章應(yīng)該比舊文章更容易得到好的排名。
Hacker News使用Paul Graham開發(fā)的Arc語言編寫,源碼可以從arclanguage.org下載。它的排名算法是這樣實(shí)現(xiàn)的:
將上面的代碼還原為數(shù)學(xué)公式:
其中,
P表示帖子的得票數(shù),減去1是為了忽略發(fā)帖人的投票。
T表示距離發(fā)帖的時(shí)間(單位為小時(shí)),加上2是為了防止最新的帖子導(dǎo)致分母過小(之所以選擇2,可能是因?yàn)閺脑嘉恼鲁霈F(xiàn)在其他網(wǎng)站,到轉(zhuǎn)貼至Hacker News,平均需要兩個(gè)小時(shí))。
G表示"重力因子"(gravityth power),即將帖子排名往下拉的力量,默認(rèn)值為1.8,后文會(huì)詳細(xì)討論這個(gè)值。
從這個(gè)公式來看,決定帖子排名有三個(gè)因素:
第一個(gè)因素是得票數(shù)P。
在其他條件不變的情況下,得票越多,排名越高。
從上圖可以看到,有三個(gè)同時(shí)發(fā)表的帖子,得票分別為200票、60票和30票(減1后為199、59和29),分別以黃色、紫色和藍(lán)色表示。在任一個(gè)時(shí)間點(diǎn)上,都是黃色曲線在最上方,藍(lán)色曲線在最下方。
如果你不想讓"高票帖子"與"低票帖子"的差距過大,可以在得票數(shù)上加一個(gè)小于1的指數(shù),比如(P-1)^0.8。
第二個(gè)因素是距離發(fā)帖的時(shí)間T。
在其他條件不變的情況下,越是新發(fā)表的帖子,排名越高。或者說,一個(gè)帖子的排名,會(huì)隨著時(shí)間不斷下降。
從前一張圖可以看到,經(jīng)過24小時(shí)之后,所有帖子的得分基本上都小于1,這意味著它們都將跌到排行榜的末尾,保證了排名前列的都將是較新的內(nèi)容。
第三個(gè)因素是重力因子G。
它的數(shù)值大小決定了排名隨時(shí)間下降的速度。
從上圖可以看到,三根曲線的其他參數(shù)都一樣,G的值分別為1.5、1.8和2.0。G值越大,曲線越陡峭,排名下降得越快,意味著排行榜的更新速度越快。
知道了算法的構(gòu)成,就可以調(diào)整參數(shù)的值,以適用你自己的應(yīng)用程序。
[參考文獻(xiàn)]
*?How Hacker News ranking algorithm works
*?How to Build a Popularity Algorithm You can be Proud of
(完)
文檔信息
- 版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證)
- 發(fā)表日期:?2012年2月24日
- 更多內(nèi)容:?檔案???算法與數(shù)學(xué)
- 購買文集:?《如何變得有思想》
- 社交媒體:?twitter,?weibo
- Feed訂閱:?
相關(guān)文章
- 2015.09.01:?理解矩陣乘法 大多數(shù)人在高中,或者大學(xué)低年級(jí),都上過一門課《線性代數(shù)》。這門課其實(shí)是教矩陣。
- 2015.07.27:?蒙特卡羅方法入門 本文通過五個(gè)例子,介紹蒙特卡羅方法(Monte Carlo Method)。
- 2015.06.10:?泊松分布和指數(shù)分布:10分鐘教程 大學(xué)時(shí),我一直覺得統(tǒng)計(jì)學(xué)很難,還差點(diǎn)掛科。
- 2013.12.16:?樸素貝葉斯分類器的應(yīng)用 生活中很多場(chǎng)合需要用到分類,比如新聞分類、病人分類等等。
留言(33條)
后續(xù)還會(huì)寫reddit吧
2012年2月24日 22:44?|?∞?|?引用
簡單即美
這么簡單的公式放在科研機(jī)構(gòu)里似乎根本“不配”寫出論文,但是,簡單即美
2012年2月24日 23:13?|?∞?|?引用
?用chrome打開網(wǎng)頁,有警告提示如下。。
警告:此頁面包含危險(xiǎn)內(nèi)容!
www.ruanyifeng.com 包含 bamosa.ru 中的內(nèi)容,后一個(gè)網(wǎng)站是已知分發(fā)惡意軟件的網(wǎng)站。如果您訪問該網(wǎng)站,您的計(jì)算機(jī)可能會(huì)中毒。
Google 發(fā)現(xiàn)如果您繼續(xù)操作,您的計(jì)算機(jī)上可能會(huì)安裝惡意軟件。如果您以前訪問過此網(wǎng)站或者您信任此網(wǎng)站,則此網(wǎng)站可能剛剛受到黑客攻擊。您不應(yīng)繼續(xù)操作,建議您明天重試或者訪問其他網(wǎng)站。
2012年2月25日 01:27?|?∞?|?引用
支持阮老師,繼續(xù)學(xué)習(xí)!
2012年2月25日 08:04?|?∞?|?引用
arc? 怎么看怎么像lisp
2012年2月25日 10:06?|?∞?|?引用
@Gower:
我的chrome沒有出現(xiàn)警告提示,我檢查了一些網(wǎng)頁代碼,好像也沒問題。
我會(huì)繼續(xù)觀察的。
2012年2月25日 10:30?|?∞?|?引用
“Hacker News使用Paul Graham開發(fā)的Arc語言編寫,源碼可以從arclanguage.org下載。”
這句話前后主語變了,光從句式上容易誤解為Hacker News的源碼,雖然從域名可以看出應(yīng)該是Arc語言的源碼。
2012年2月25日 10:53?|?∞?|?引用
難道我理解錯(cuò)了,但我記得Hacker News不是開源的呀。
2012年2月25日 10:57?|?∞?|?引用
引用osirpt的發(fā)言:
arc? 怎么看怎么像lisp
arclanguage.org 網(wǎng)站上說了, arc是lisp的一個(gè)方言。
2012年2月25日 10:59?|?∞?|?引用
很好奇你的這些信息是從哪里來的。
2012年2月25日 11:20?|?∞?|?引用
引用Magic的發(fā)言:
很好奇你的這些信息是從哪里來的。
很早以前,國內(nèi)有人討論HN還有reddit的算法,這些算法應(yīng)該是這些網(wǎng)站自己公布的吧,純粹推測(cè)有難度。2012年2月25日 15:05?|?∞?|?引用
@Gower:
我知道怎么回事了,圖床image.beekka.com的.htaccess文件被掛馬了。
已經(jīng)清除了。
2012年2月25日 16:23?|?∞?|?引用
重力因子 是反對(duì)票嗎?
2012年2月25日 16:36?|?∞?|?引用
網(wǎng)站排版看著很舒服
2012年2月25日 18:28?|?∞?|?引用
這個(gè)真是不錯(cuò)!既考慮了時(shí)間,又考慮了得票數(shù)!頂一!
2012年2月27日 17:34?|?∞?|?引用
學(xué)習(xí)了,美味書簽的算法我之前也考慮過,是一個(gè)簡單可行的算法;Hacker News的排名算法不知道有沒有名字,真是太好了,可以調(diào)整。以前也學(xué)習(xí)過srmeme曾經(jīng)的一個(gè)網(wǎng)站算法,非常不錯(cuò),國內(nèi)應(yīng)該還是缺少這種應(yīng)用,當(dāng)然,在國內(nèi)這種環(huán)境必須要嚴(yán)防作弊。
2012年2月28日 17:17?|?∞?|?引用
國內(nèi)有沒有一個(gè)類似Hacknews的網(wǎng)站呢
2012年3月 1日 16:59?|?∞?|?引用
關(guān)注中~~
2012年3月 2日 15:07?|?∞?|?引用
我覺得應(yīng)該做好信息的分類工作
2012年3月 4日 10:29?|?∞?|?引用
阮先生,你的文章值得一讀,期待后續(xù),支持
2012年3月 4日 11:02?|?∞?|?引用
dwadwa
2012年3月 4日 23:21?|?∞?|?引用
o(∩_∩)o 你的文章太簡練了,太美了,比那些科研論文有價(jià)值多了.
PS:能不能分享下你的學(xué)習(xí)方式和每一篇文章背后的故事。
2012年3月 4日 23:36?|?∞?|?引用
最近博主沒更新文章呢,有點(diǎn)小擔(dān)心~~
2012年3月 5日 18:54?|?∞?|?引用
看過您好多文章,今天這里問候一聲~
2012年3月 6日 10:55?|?∞?|?引用
引用Brooklyn的發(fā)言:
很早以前,國內(nèi)有人討論HN還有reddit的算法,這些算法應(yīng)該是這些網(wǎng)站自己公布的吧,純粹推測(cè)有難度。
以前有人在HN上問過:?http://news.ycombinator.com/item?id=1781013
不過你也可以根據(jù)上面的代碼中的comments搜索:
https://www.google.com/search?q=Votes+divided+by+the+age+in+hours+to+the+gravityth+power.&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
會(huì)得到很多結(jié)果,比如這篇?http://amix.dk/blog/post/19574?就是阮一峰參考文獻(xiàn)之一
2012年3月 6日 23:02?|?∞?|?引用
請(qǐng)問,得票數(shù)P減1怎樣理解呢?
“P表示帖子的得票數(shù),減去1是為了忽略發(fā)帖人的投票。”這句話是理解成:系統(tǒng)規(guī)定每個(gè)新帖票數(shù)初值為1,還是假設(shè)每個(gè)發(fā)帖人都會(huì)為自己的帖子投上一票,亦或其它理解?
2012年3月16日 09:48?|?∞?|?引用
Hacker News 的算法 非常不錯(cuò)啊~!
2012年3月20日 22:07?|?∞?|?引用
您的這篇文字,讓我茅塞頓開!期待更多簡潔實(shí)用的文章!
2012年9月28日 15:21?|?∞?|?引用
糾錯(cuò)“一、Delicious
最直覺、最簡單的算法,莫過于按照單位時(shí)間內(nèi)用戶的投票數(shù)進(jìn)行排名。得票最多的項(xiàng)目,自然就排在第一位。” 按語境猜測(cè),應(yīng)該是“最直接”,樓主筆誤了。不是挑刺,純粹是個(gè)人強(qiáng)迫癥,見不得好東西有瑕疵。
2013年1月30日 10:25?|?∞?|?引用
引用Nemo的發(fā)言:
國內(nèi)有沒有一個(gè)類似Hacknews的網(wǎng)站呢
Fenng創(chuàng)建了一個(gè):http://news.dbanotes.net/
2013年2月18日 09:10?|?∞?|?引用
引用Nemo的發(fā)言:
國內(nèi)有沒有一個(gè)類似Hacknews的網(wǎng)站呢
試試這個(gè)?http://news.icode.hk/
2013年4月29日 21:00?|?∞?|?引用
感謝阮老師的總結(jié)。
作為一個(gè)還算大型的 BBS ,我們采用了 SF 的算法進(jìn)行 『本土化改良』
2013年7月22日 11:47?|?∞?|?引用
您好,看了您的文章受益匪淺,可是也產(chǎn)生了一個(gè)疑惑,這些算法如何在網(wǎng)站中具體實(shí)現(xiàn),直接用SQL order 似乎不太可能,希望您能指導(dǎo)一下。。。。謝謝。。。
2014年9月 3日 11:18?|?∞?|?引用
總結(jié)
以上是生活随笔為你收集整理的基于用户投票的排名算法(一):Delicious和Hacker的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于用户投票的排名算法Reddit
- 下一篇: 基于用户投票的排名算法(三):Stack