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