基于用户投票的排名算法(五):威尔逊区间
日期:?2012年3月20日
迄今為止,這個系列都在討論,如何給出"某個時段"的排名,比如"過去24小時最熱門的文章"。
但是,很多場合需要的是"所有時段"的排名,比如"最受用戶好評的產品"。
這時,時間因素就不需要考慮了。這個系列的最后兩篇,就研究不考慮時間因素的情況下,如何給出排名。
一種常見的錯誤算法是:
得分 = 贊成票 - 反對票
假定有兩個項目,項目A是60張贊成票,40張反對票,項目B是550張贊成票,450張反對票。請問,誰應該排在前面?按照上面的公式,B會排在前面,因為它的得分(550 - 450 = 100)高于A(60 - 40 = 20)。但是實際上,B的好評率只有55%(550 / 1000),而A為60%(60 / 100),所以正確的結果應該是A排在前面。
Urban Dictionary就是這種錯誤算法的實例。
另一種常見的錯誤算法是
得分 = 贊成票 / 總票數
如果"總票數"很大,這種算法其實是對的。問題出在如果"總票數"很少,這時就會出錯。假定A有2張贊成票、0張反對票,B有100張贊成票、1張反對票。這種算法會使得A排在B前面。這顯然錯誤。
Amazon就是這種錯誤算法的實例。
那么,正確的算法是什么呢?
我們先做如下設定:
(1)每個用戶的投票都是獨立事件。
(2)用戶只有兩個選擇,要么投贊成票,要么投反對票。
(3)如果投票總人數為n,其中贊成票為k,那么贊成票的比例p就等于k/n。
如果你熟悉統計學,可能已經看出來了,這是一種統計分布,叫做"二項分布"(binomial distribution)。這很重要,下面馬上要用到。
我們的思路是,p越大,就代表這個項目的好評比例越高,越應該排在前面。但是,p的可信性,取決于有多少人投票,如果樣本太小,p就不可信。好在我們已經知道,p是"二項分布"中某個事件的發生概率,因此我們可以計算出p的置信區間。所謂"置信區間",就是說,以某個概率而言,p會落在的那個區間。比如,某個產品的好評率是80%,但是這個值不一定可信。根據統計學,我們只能說,有95%的把握可以斷定,好評率在75%到85%之間,即置信區間是[75%, 85%]。
這樣一來,排名算法就比較清晰了:
第一步,計算每個項目的"好評率"(即贊成票的比例)。
第二步,計算每個"好評率"的置信區間(以95%的概率)。
第三步,根據置信區間的下限值,進行排名。這個值越大,排名就越高。
這樣做的原理是,置信區間的寬窄與樣本的數量有關。比如,A有8張贊成票,2張反對票;B有80張贊成票,20張反對票。這兩個項目的贊成票比例都是80%,但是B的置信區間(假定[75%, 85%])會比A的置信區間(假定[70%, 90%])窄得多,因此B的置信區間的下限值(75%)會比A(70%)大,所以B應該排在A前面。
置信區間的實質,就是進行可信度的修正,彌補樣本量過小的影響。如果樣本多,就說明比較可信,不需要很大的修正,所以置信區間會比較窄,下限值會比較大;如果樣本少,就說明不一定可信,必須進行較大的修正,所以置信區間會比較寬,下限值會比較小。
二項分布的置信區間有多種計算公式,最常見的是"正態區間"(Normal approximation interval),教科書里幾乎都是這種方法。但是,它只適用于樣本較多的情況(np > 5 且 n(1 ? p) > 5),對于小樣本,它的準確性很差。
1927年,美國數學家 Edwin Bidwell Wilson提出了一個修正公式,被稱為"威爾遜區間",很好地解決了小樣本的準確性問題。
在上面的公式中,表示樣本的"贊成票比例",n表示樣本的大小,表示對應某個置信水平的z統計量,這是一個常數,可以通過查表或統計軟件包得到。一般情況下,在95%的置信水平下,z統計量的值為1.96。
威爾遜置信區間的均值為
它的下限值為
可以看到,當n的值足夠大時,這個下限值會趨向。如果n非常小(投票人很少),這個下限值會大大小于。實際上,起到了降低"贊成票比例"的作用,使得該項目的得分變小、排名下降。
Reddit的評論排名,目前就使用這個算法。
[參考文獻]
*?How Not To Sort By Average Rating
(完)
文檔信息
- 版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
- 發表日期:?2012年3月20日
- 更多內容:?檔案???算法與數學
- 購買文集:?《如何變得有思想》
- 社交媒體:?twitter,?weibo
- Feed訂閱:?
相關文章
- 2015.09.01:?理解矩陣乘法 大多數人在高中,或者大學低年級,都上過一門課《線性代數》。這門課其實是教矩陣。
- 2015.07.27:?蒙特卡羅方法入門 本文通過五個例子,介紹蒙特卡羅方法(Monte Carlo Method)。
- 2015.06.10:?泊松分布和指數分布:10分鐘教程 大學時,我一直覺得統計學很難,還差點掛科。
- 2013.12.16:?樸素貝葉斯分類器的應用 生活中很多場合需要用到分類,比如新聞分類、病人分類等等。
留言(39條)
這個算法很好啊,可以用在paper里邊了。我是做機械工程的。多謝多謝。
2012年3月20日 05:59?|?∞?|?引用
頂,又是一個不錯的算法!
2012年3月20日 08:11?|?∞?|?引用
很好的系列
2012年3月20日 09:14?|?∞?|?引用
概率論又一次立功了,賭徒的藝術!
2012年3月20日 10:01?|?∞?|?引用
整個系列看下來,收獲很多
2012年3月20日 14:02?|?∞?|?引用
其實我覺得一個簡單函數就可以解決此問題: score = 贊成比例 * min(投票數, 100)
1. 當投票數100時,score取決于贊成比例。
2. 若一個
2012年3月20日 14:47?|?∞?|?引用
2. 若一個小于100投票數的物品要排到大于100投票數且好評率為n%的物品前面,就必須有至少n個好評。或積累100個投票后,靠好評率勝出。
2012年3月20日 14:53?|?∞?|?引用
引用suranxu的發言:
2. 若一個小于100投票數的物品要排到大于100投票數且好評率為n%的物品前面,就必須有至少n個好評。或積累100個投票后,靠好評率勝出。
如果我沒理解錯,贊成比例應該是這樣計算:贊成比例 = 好評數/投票數。
則,當投票數小于100,score = (好評數/投票數)*投票數 = 好評數
當投票數大于等于100, score = (好評數/投票數)*100
因為投票數大于等于100,所以此時score應該是等于好評數乘以一個小于等于1的系數,該系數與投票數成反比。
也就是說,相同的好評數,投票數越多,得分越低。
挺好的。
2012年3月20日 15:44?|?∞?|?引用
樓主您好:
我拜讀了這篇文章,收獲很多.但是我對該文章對二項式分析一個地方有點質疑:
文章說"如果投票總人數為n,其中贊成票為k,那么贊成票的比例p就等于k/n。如果你熟悉統計學,可能已經看出來了,p服從一種統計分布,叫做"兩項分布"(binomial distribution)。"
我覺得得票比例p不符合二項分布. 應該是 總票數為n,在得票比例為p情況下,獲得贊成票的次數k的概率 符合二項分布 P(X=k) = C(n,k) * p^k * (1-p)^(n-k)
k= 0,1,2,3....n 其中C(n,k) = n!/ (k!*(n-k)!)
如果 比例p不符合二項分布,那么后面的結論就都不對了.
還望樓主幫忙分析下我的理解對不對. 謝謝!
2012年3月20日 16:51?|?∞?|?引用
引用Wesker的發言:
樓主您好:
我拜讀了這篇文章,收獲很多.但是我對該文章對二項式分析一個地方有點質疑:
文章說"如果投票總人數為n,其中贊成票為k,那么贊成票的比例p就等于k/n。如果你熟悉統計學,可能已經看出來了,p服從一種統計分布,叫做"兩項分布"(binomial distribution)。"
我覺得得票比例p不符合二項分布. 應該是 總票數為n,在得票比例為p情況下,獲得贊成票的次數k的概率 符合二項分布 P(X=k) = C(n,k) * p^k * (1-p)^(n-k)
k= 0,1,2,3....n其中C(n,k) = n!/ (k!*(n-k)!)
如果 比例p不符合二項分布,那么后面的結論就都不對了.
還望樓主幫忙分析下我的理解對不對. 謝謝!
嗯,應該是k服從二項分布。在計算p的置信區間時,可假設p是漸近正態的,從而算出置信區間。2012年3月20日 18:17?|?∞?|?引用
@Wesker:
你說得對,應該是K服從二項分布。
我對統計還是不熟,這里已經改過來了。謝謝指出。
這個地方不影響下面的結論,那些公式本來就是針對p的(二項分布的比例)。
2012年3月20日 20:50?|?∞?|?引用
理解了“置信區間”的意義,多謝阮哥
2012年3月21日 12:21?|?∞?|?引用
亞馬遜里面的那個例子,用戶可不是只有兩個選擇,而是從一星到五星的評級。雖然從結果來講也是不合適的,但是也不適用兩項分布、威爾遜區間的吧。
2012年3月21日 14:34?|?∞?|?引用
「兩項分布」,這個說法從來沒聽過,以至于我以為是什么新東西呢。。。
2012年3月22日 01:45?|?∞?|?引用
還是按國內的習慣改成二項分布吧
2012年3月22日 10:02?|?∞?|?引用
用Bayesian inference,共軛函數選Binomial不就行了,不需要搞這么復雜的公式。
2012年3月27日 04:13?|?∞?|?引用
引用yangwenli的發言:
還是按國內的習慣改成二項分布吧
謝謝指出,已經更正了。
2012年3月27日 20:17?|?∞?|?引用
好算法,我以前一直以為熱門文章的算法很簡單,就是挑瀏覽量最大的,我的wordpress博客就是這樣的
2012年3月28日 19:24?|?∞?|?引用
哥哥好哦~追你博蠻久了,偶是名大四女生,熱愛寫作、分享idea.之前全在門戶網站的空間寫blog,但到這后,自己開獨立blog的想法非常強烈,我希望也能開一個像這里一樣的自由獨立的博~~~淚求哥哥指點一二啊。。。
前面看過如何開的日志說明,但那些對我還是難了點。。還有,請問要money嗎?要向誰申請嗎?申請困難嗎?
2012年3月30日 10:01?|?∞?|?引用
引用Janet的發言:
自己開獨立blog的想法非常強烈,我希望也能開一個像這里一樣的自由獨立的博~~~
如果你不懂技術,還是不要開獨立Blog了,非常麻煩,還要花錢。
要是能翻墻,我非常推薦Blogger和Tumblr的服務。
2012年3月30日 18:50?|?∞?|?引用
書到用時方恨少啊!
以前學概率和統計的時候感覺很枯燥,不知道學了有什么用,現在發現很多領域都要用到這些知識。如果以前在學的時候早點接觸到這些需要用到這方面知識的領域時就可以更加針對性的學了,有動力,也不會感到枯燥了。得補補了~
2012年3月31日 10:18?|?∞?|?引用
讓我對置信上下界的理解加深了,也就是說,我們在考慮用統計值來估計真實情況的時候,都應該考慮置信界限,否則在采樣不夠的時候,會有差別較大的判斷。
2012年3月31日 20:48?|?∞?|?引用
Thanks....
2012年3月31日 23:25?|?∞?|?引用
寫的好復雜,簡單地說,就是根據置信區間的下限進行排名嘛。
2012年4月 2日 21:30?|?∞?|?引用
引用愛早起的發言:
好算法,我以前一直以為熱門文章的算法很簡單,就是挑瀏覽量最大的,我的wordpress博客就是這樣的
最簡單的就是按照瀏覽量的。就一個權。
除了瀏覽量,還需要考慮回復,文章引用,回復的引用,打分等等!
2012年4月12日 13:16?|?∞?|?引用
這種東西都是需要加權的,各種權重有自己的比例,然后綜合運算。
2012年4月12日 13:18?|?∞?|?引用
引用zisasign的發言:
如果我沒理解錯,贊成比例應該是這樣計算:贊成比例 = 好評數/投票數。
則,當投票數小于100,score = (好評數/投票數)*投票數 = 好評數
當投票數大于等于100, score = (好評數/投票數)*100
因為投票數大于等于100,所以此時score應該是等于好評數乘以一個小于等于1的系數,該系數與投票數成反比。
也就是說,相同的好評數,投票數越多,得分越低。
挺好的。
A好評數10,總投票數10,那得分是10
B好評數500,總投票數5000,得分也是10
這樣到底合不合理呢
2012年4月13日 14:17?|?∞?|?引用
這里的回復系統是不是有問題,前幾天我發了個回復,今天回來看就不見了
2012年4月13日 14:19?|?∞?|?引用
這個系列讀下來,收獲很多。4年開始學習計算機的時候,不明白為什么“軟件的本質是數學”,今天終于領悟一點點了, 謝謝LZ!!
2012年9月28日 15:50?|?∞?|?引用
現在才發現概率論是有用的。
2012年10月 1日 16:30?|?∞?|?引用
引用suranxu的發言:
2. 若一個小于100投票數的物品要排到大于100投票數且好評率為n%的物品前面,就必須有至少n個好評。或積累100個投票后,靠好評率勝出。
關鍵是你的那個100如何確定的?
2013年1月21日 13:35?|?∞?|?引用
百度搜索排名算法找過來的,認真拜讀了博主的“基于用戶投票的排名算法”多篇文章,收獲頗多。如果不基于用戶投票,而且一個商品的評價數、評分,應該如何排名呢?
2013年1月22日 14:03?|?∞?|?引用
> 表示對應某個置信水平的z統計量,這是一個常數,可以通過查表或統計軟件包得到。一般情況下,在95%的置信水平下,z統計量的值為1.96。
請問這個常數表是什么表,哪里可以得到?
我用這個算法做 了一些實踐,發現有些區間邊界不理想,想調整這個常數試試。
2013年10月 4日 22:34?|?∞?|?引用
引用quady的發言:
A好評數10,總投票數10,那得分是10
B好評數500,總投票數5000,得分也是10
這樣到底合不合理呢
如果只看這一瞬間快照的話,好像很不合理,明顯A商品吃虧了。
但其實我覺得把時間跨度放長一些,這并不是一個系統性問題。一方面,如果A商品確實是一個被廣泛認可的好商品(而不是一個極其小眾的“好商品”),它會快速積累到更多投票(想象一個新出的電影,或者一個性價比卓越的新賣家,它的投票不不會因為默認排名不靠前就積累不到新的投票),很快就會超過B商品。另一方面,如果A商品真的就此止步于此,沒有人再給它投票,如此小眾的商品真的應該排在B的前面嗎。比如“日常用品”頻道首頁到底應該排除一個劣質的馬桶墊,還是排出一款非常好用便宜實惠的“宇航員太空便便吸收器”?真的要選擇其一嗎?
2013年10月20日 19:44?|?∞?|?引用
引用丕子的發言:
關鍵是你的那個100如何確定的?
我...拍腦袋想的。Orz請各位學院派大大們原諒我的暴虐吧。>_
其實寫100主要是它數學形式上看起來比較好看,同時100這個數基本又能滿足可信性。這其實這就是一個票數少于閾值時降權的山炮模型,參數值可以調,個數也可以再加。
我想表達的是,其實一些復雜模型數學上可能很漂亮,但實際效果相對簡單規則模型往往提升了了,甚至會下降,而巨大的性能消耗在真實的線上環境上很多并不適用。(其實博主的例子比較特殊,因為投票畢竟不是一個頻繁行為,如果換個場景,把好評換成點擊,投票換成PV呢,點擊每秒都在發生,PV每秒可能成千上萬了,都這么算根本吃不消呵)
2013年10月20日 20:02?|?∞?|?引用
有一個小問題,假如贊成票和反對票都是0時下限值應該怎么計算?
2013年11月15日 13:21?|?∞?|?引用
大家好,我在我的網站上采用了阮先生介紹的這個威爾遜區間算法,
來決定1個詞條下不同定義的排位順序。
我的網站是用python下的Django開發的,
因此實現起來也有現成的代碼可用。
歡迎來參觀指導。
http://liyuwiki.com/technologies.html
2014年7月 2日 10:27?|?∞?|?引用
有個疑問,請問置信區間怎么取?
2014年9月16日 18:03?|?∞?|?引用
請問這個常數表在哪里查的啊?能給個鏈接么?
引用閑耘的發言:
> 表示對應某個置信水平的z統計量,這是一個常數,可以通過查表或統計軟件包得到。一般情況下,在95%的置信水平下,z統計量的值為1.96。
請問這個常數表是什么表,哪里可以得到?
我用這個算法做 了一些實踐,發現有些區間邊界不理想,想調整這個常數試試。
2015年7月20日 14:10?|?∞?|?引用
總結
以上是生活随笔為你收集整理的基于用户投票的排名算法(五):威尔逊区间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于用户投票的排名算法(四):牛顿冷却定
- 下一篇: 基于用户投票的排名算法(六):贝叶斯平均