在第一篇打分系統漫談1 - 時間衰減咱們聊了兩種相對簡單的打分算法Hacker News和Reddit Hot Formula,也提出了幾個這兩種算法可能存在的問題,這一篇咱們就其中的兩一個問題進一步討論:html
讓咱們從上一篇咱們提到的Reddit Hot Formula來講起,拋開文章質量的懲罰項,只考慮點贊拍磚的低配版打分公式是
\[ score = sign(U-D)* log_{10}{|U-D|} + seconds/4500 \]
Evan從經濟學指望效用這個新穎的角度試圖對上述公式進行復現,幾個基本假設包括:算法
上述機率p,q能夠用已有數據進行估計:函數
在沒有任何和文章相關的信息時,喜歡不喜歡的機率是同樣的\(p=\frac{1}{2}\), 當咱們得到一篇文章的點贊量和拍磚數時咱們能夠用點贊率對機率進行更新獲得\(p = \frac{U+1}{U+D+2}\)spa
機率q是一篇t時刻前發佈的文章沒有被做者讀過的機率,換言之就是用戶在t時間內沒有刷新界面的機率\(q = p(N_\lambda=0)= p(x>t)= exp(-\lambda t)\)orm
綜上咱們能夠獲得對數效用的表達式:htm
\[ \begin{align} Utility & = p * q -(1-p) * q \\ & = exp(-\lambda t ) *(\frac{U+1}{U+D+2} - \frac{D+1}{U+D+2}) \\ &= exp(-\lambda t ) *(\frac{U-D}{U+D+2}) \\ log(Utility ) & = log(U-D) - log(U+D+2) - \lambda t \\ \end{align} \]blog
和上述Reddit Hot Formula對比咱們會發現當U>D的時候,兩個表達式是基本一致的,最大的不一樣是Reddit沒有指望效用的第二個對數項\(log(U+D+2)\)。換言之Reddit只考慮點贊量而沒有考慮點贊量對應的基數,這個基數能夠是點贊+拍磚或者是用戶的瀏覽量。圖片
咱們舉個例子你就會明白這種打分可能存在的問題,咱們拿Stack overflow來舉個例子,下圖的兩個問題得到了差很少的投票57 vs. 53,可是會發現第一個問題比第二個問題多一倍的瀏覽量4k vs. 2K, 因此從投票率來看反而是第二個問題的投票率更高。
get
這樣看彷佛咱們應該使用點贊(投票)率而非簡單的點贊量來對文章進行打分,可是點贊率真的永遠可信麼? 咱們再看一個例子數據分析
單從投票率來看,第一個問題投票率高達50%可是瀏覽量只有2 ,而第二個問題投票率較低可是瀏覽量很高。若是但從投票率來看,彷佛第一個問題排名更高,可是直覺告訴咱們第二個問題應該排名更靠前。這就涉及統計學中點估計的置信度問題。
讓咱們來把用戶點贊這個行爲抽象一下,咱們假設每個用戶要麼點贊要麼拍磚,每個用戶之間的行爲之間獨立,因此每一個用戶\(\sim Bernoulli(p)\), 其中p是點讚的機率。當樣本量足夠大的時候,根據大數定律用戶點讚的頻率會趨於點贊率$\lim\limits_{x \to \infty} P(|\frac{n_x}{n} - p| < \epsilon)=1 $
可是當用戶量不夠,樣本比較小的時候,計算的點贊率會和整體機率會存在較大的誤差。一種解決方法就是使用區間估計而非點估計,咱們給出點贊率估計的下邊界而非點贊率的估計值。
最經常使用的二項分佈的區間估計由近似正態分佈給出。根據大數定律,參數爲n,p的二項分佈在\(n \to \infty\)的時候 \(\frac{\hat{p}-p}{\sqrt{p(1-p)/n}} \sim N(0,1)\)。根據正態分佈的置信區間咱們會獲得二項分佈的近似區間估計以下
\[ \begin{align} & p( | \frac{\hat{p}-p}{\sqrt{p(1-p)/n}} | < z_{\alpha/2}) = 1- \alpha \\ & where \, 置信度是0.95,\alpha = 0.05 \\ &\hat{p}是根據每一個用戶點贊行爲給出的點贊率的估計\\ &n是樣本量,能夠是用戶點贊+拍磚的總和,或者是用戶瀏覽量\\ &p是整體的點贊率是咱們但願獲得的估計\\ \end{align} \]
Wald Interval 對上述近似區間用樣本估計\(\hat{p}\)替代整體p,給出了最經常使用的二項分佈置信區間:
\[ \begin{align} p_-,p_+ = \hat{p} \pm z_{\alpha/2}\sqrt{\hat{p}(1-\hat{p})/n} \end{align} \]
wald置信區間適用大多數狀況,可是在下面三個狀況下會存在問題:
而在估計文章點贊率這個場景下咱們不可避免的會碰到上述3個狀況,在這種狀況咱們每每會使用更加複雜的置信區間算法。來來來下面讓咱們說說其中一種高配版的置信區間- Wilson Interval
Wilson對Walt置信區間作了修正, Wilson置信區間的上下界以下:
\[ \begin{align} p_-,p_+ = \frac{\hat{p} + \frac{z^2_{\alpha/2}}{2n}} {1 +\frac{z^2_{\alpha/2}}{n}} \pm z_{\alpha/2}\frac{\sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2_{\alpha/2}}{4n^2} }}{1 +\frac{z^2_{\alpha/2}}{n}} \end{align} \]
看着老複雜了,讓咱們來拆解一下你就會發現原理蠻好理解的。先說說對整體均值的估計,wilson對\(\hat{p}\)進行了以下調整:
\[ \hat{p} \to \tilde{p} = \frac{\hat{p} + \frac{z^2_{\alpha/2}}{2n}} {1 +\frac{z^2_{\alpha/2}}{n}} \]
當樣本量足夠大Wilson和Walt對整體均值的估計會趨於一致。當樣本量很小的時候, 不一樣於walt,wilson給樣本估計加了一個\(\frac{1}{2}\)的貝葉斯前置機率(點贊和拍磚的機率各是50%),而後不斷用新增樣原本對這個前置機率進行調整。從而避免樣本較小的時候樣本估計過分偏離整體的問題。
\[ \begin{align} when \lim\limits_{n \to \infty} \tilde{p} \to \hat{p} \\ when \lim\limits_{n \to 0} \tilde{p} \to \frac{1}{2} \\ \end{align} \]
方差部分也作了相同的處理, 當樣本足夠大的時候wilson和walt對整體方差的估計會趨於一致,可是當樣本小的時候和上述樣本均值的處理方法同樣,會趨於貝葉斯前置機率對應的方差\(\hat{p} \to \frac{1}{2} \Rightarrow \hat{p}(1-\hat{p}) \to \frac{1}{4}\)
\[ \begin{align} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \to \frac{\sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2_{\alpha/2}}{4n^2} }}{1 +\frac{z^2_{\alpha/2}}{n}} \end{align} \]
下面兩張圖片很直觀的給出了不一樣樣本數量(n=10 vs.100)下,樣本均值的估計所對應的置信區間的長度(方差估計)。當樣本大的時候Wilson和Wald幾乎同樣,當樣本小的時候,隨着p趨於0 or 1,Wilson置信區間會顯著寬於Walt區間。
而Wilson打分就是取Wilson置信區間的下界:
\[ \begin{align} score= \frac{\hat{p} + \frac{z^2_{\alpha/2}}{2n}} {1 +\frac{z^2_{\alpha/2}}{n}} - z_{\alpha/2} \frac{\sqrt{\frac{\hat{p}(1-\hat{p})}{n} + \frac{z^2_{\alpha/2}}{4n^2} }}{1 +\frac{z^2_{\alpha/2}}{n}} \end{align} \]
Wilson打分方式有幾個很好的特性:
在下一篇文章咱們繼續聊聊另外一種更靈活的處理小樣本打分的方法- 貝葉斯更新
Reference