基於使用者投票的排名演算法(六):貝葉斯平均

阮一峰發表於2012-03-28

(這個系列實在拖得太久,今天是最後一篇。)

上一篇介紹了"威爾遜區間",它解決了投票人數過少、導致結果不可信的問題。

舉例來說,如果只有2個人投票,"威爾遜區間"的下限值會將贊成票的比例大幅拉低。這樣做固然保證了排名的可信性,但也帶來了另一個問題:排行榜前列總是那些票數最多的專案,新專案或者冷門的專案,很難有出頭機會,排名可能會長期靠後。

IMDB為例,它是世界最大的電影資料庫,觀眾可以對每部電影投票,最低為1分,最高為10分。

基於使用者投票的排名演算法(六):貝葉斯平均

系統根據投票結果,計算出每部電影的平均得分。然後,再根據平均得分,排出最受歡迎的前250名的電影。

基於使用者投票的排名演算法(六):貝葉斯平均

這裡就有一個問題:熱門電影與冷門電影的平均得分,是否真的可比?舉例來說,一部好萊塢大片有10000個觀眾投票,一部小成本的文藝片只有100個觀眾投票。這兩者的投票結果,怎麼比較?如果使用"威爾遜區間",後者的得分將被大幅拉低,這樣處理是否公平,能不能反映它們真正的質量?

一個合理的思路是,如果要比較兩部電影的好壞,至少應該請同樣多的觀眾觀看和評分。既然文藝片的觀眾人數偏少,那麼應該設法為它增加一些觀眾。

排名頁面的底部,IMDB給出了它的計算方法。

  基於使用者投票的排名演算法(六):貝葉斯平均

  - WR, 加權得分(weighted rating)。
  - R,該電影的使用者投票的平均得分(Rating)。
  - v,該電影的投票人數(votes)。
  - m,排名前250名的電影的最低投票數(現在為3000)。
  - C, 所有電影的平均得分(現在為6.9)。

仔細研究這個公式,你會發現,IMDB為每部電影增加了3000張選票,並且這些選票的評分都為6.9。這樣做的原因是,假設所有電影都至少有3000張選票,那麼就都具備了進入前250名的評選條件;然後假設這3000張選票的評分是所有電影的平均得分(即假設這部電影具有平均水準);最後,用現有的觀眾投票進行修正,長期來看,v/(v+m)這部分的權重將越來越大,得分將慢慢接近真實情況。

這樣做拉近了不同電影之間投票人數的差異,使得投票人數較少的電影也有可能排名前列。

把這個公式寫成更一般的形式:

  基於使用者投票的排名演算法(六):貝葉斯平均

  - C,投票人數擴充套件的規模,是一個自行設定的常數,與整個網站的總體使用者人數有關,可以等於每個專案的平均投票數。
  - n,該專案的現有投票人數。
  - x,該專案的每張選票的值。
  - m,總體平均分,即整個網站所有選票的算術平均值。

這種演算法被稱為"貝葉斯平均"(Bayesian average)。因為某種程度上,它借鑑了"貝葉斯推斷"(Bayesian inference)的思想:既然不知道投票結果,那就先估計一個值,然後不斷用新的資訊修正,使得它越來越接近正確的值。

在這個公式中,m(總體平均分)是"先驗概率",每一次新的投票都是一個調整因子,使總體平均分不斷向該專案的真實投票結果靠近。投票人數越多,該專案的"貝葉斯平均"就越接近算術平均,對排名的影響就越小。

因此,這種方法可以給一些投票人數較少的專案,以相對公平的排名。

=================================================

"貝葉斯平均"也有缺點,主要問題是它假設使用者的投票是正態分佈。比如,電影A有10個觀眾評分,5個為五星,5個為一星;電影B也有10個觀眾評分,都給了三星。這兩部電影的平均得分(無論是算術平均,還是貝葉斯平均)都是三星,但是電影A可能比電影B更值得看。

解決這個問題的思路是,假定每個使用者的投票都是獨立事件,每次投票只有n個選項可以選擇,那麼這就服從"多項分佈"(Multinomial distribution),就可以結合貝葉斯定理,估計該分佈的期望值。由於這涉及複雜的統計學知識,這裡就不深入了,感興趣的朋友可以繼續閱讀William Morgan的How to rank products based on user input

(完)

相關文章