這個系列的前三篇,介紹了Hacker News,Reddit和Stack Overflow的排名算法。
今天,討論一個更一般的數(shù)學模型。
這個系列的每篇文章,都是可以分開讀的。但是,為了保證所有人都在同一頁上,我再說一下,到目前為止,我們用不同方法,企圖解決的都是同一個問題:根據(jù)用戶的投票,決定最近一段時間內的"熱文排名"。
你可能會覺得,這是一個全新的課題,伴隨著互聯(lián)網而產生,需要全新的方法來解決。但是,實際上不是。我們可以把"熱文排名"想象成一個"自然冷卻"的過程:
(1)任一時刻,網站中所有的文章,都有一個"當前溫度",溫度最高的文章就排在第一位。
(2)如果一個用戶對某篇文章投了贊成票,該文章的溫度就上升一度。
(3)隨著時間流逝,所有文章的溫度都逐漸"冷卻"。

這樣假設的意義,在于我們可以照搬物理學的冷卻定律,使用現(xiàn)成的公式,建立"溫度"與"時間"之間的函數(shù)關系,輕松構建一個"指數(shù)式衰減"(Exponential decay)的過程。

偉大的物理學家牛頓,早在17世紀就提出了溫度冷卻的數(shù)學公式,被后人稱作"牛頓冷卻定律"(Newton's Law of Cooling)。我們就用這個定律構建排名算法。

"牛頓冷卻定律"非常簡單,用一句話就可以概況:
物體的冷卻速度,與其當前溫度與室溫之間的溫差成正比。
寫成數(shù)學公式就是:

其中,
- T(t)是溫度(T)的時間(t)函數(shù)。微積分知識告訴我們,溫度變化(冷卻)的速率就是溫度函數(shù)的導數(shù)T'(t)。
- H代表室溫,T(t)-H就是當前溫度與室溫之間的溫差。由于當前溫度高于室溫,所以這是一個正值。
- 常數(shù)α(α>0)表示室溫與降溫速率之間的比例關系。前面的負號表示降溫。不同的物質有不同的α值。
這是一個微分方程,為了計算當前溫度,需要求出T(t)的函數(shù)表達式。
第一步,改寫方程,然后等式兩邊取積分。

第二步,求出這個積分的解(c為常數(shù)項)。

第三步,假定在時刻t0,該物體的溫度是T(t0),簡寫為T0。代入上面的方程,得到

第四步,將上一步的C代入第二步的方程。

假定室溫H為0度,即所有物體最終都會"冷寂",方程就可以簡化為

上面這個方程,就是我們想要的最終結果:
本期溫度 = 上一期溫度 x exp(-(冷卻系數(shù)) x 間隔的小時數(shù))
將這個公式用在"排名算法",就相當于(假定本期沒有增加凈贊成票)
本期得分 = 上一期得分 x exp(-(冷卻系數(shù)) x 間隔的小時數(shù))
其中,"冷卻系數(shù)"是一個你自己決定的值。如果假定一篇新文章的初始分數(shù)是100分,24小時之后"冷卻"為1分,那么可以計算得到"冷卻系數(shù)"約等于0.192。如果你想放慢"熱文排名"的更新率,"冷卻系數(shù)"就取一個較小的值,否則就取一個較大的值。

[參考文獻]
* Rank Hotness With Newton's Law of Cooling
(完)
相關閱讀:
