基于統計思想下的推薦系統-36大數據
作者:沙韜偉
我們先做如下設定:
- 每個用戶的打分都是獨立事件。
- 用戶只有兩個選擇,要么投喜歡’1’,要么投不喜歡’0’。
- 如果總人數為n,其中喜歡的為k,那么喜歡的比例p就等于k/n。
這是一種統計分布,叫做”二項分布”(binomial distribution)
理論上講,p越大應該越好,但是n的不同,導致p的可信性有差異。100個人投票,50個人投喜歡;10個人投票,6個人喜歡,我們不能說后者比前者要好。
所以這邊同時要考慮(p,n)
剛才說滿足二項分布,這里p可以看作”二項分布”中某個事件的發生概率,因此我們可以計算出p的置信區間。
所謂”置信區間”,就是說,以某個概率而言,p會落在的那個區間。
置信區間展現的是這個參數的真實值有一定概率落在測量結果的周圍的程度。置信區間給出的是被測量參數的測量值的可信程度,即前面所要求的“一個概率”,也就是結論的可信程度。
二項分布的置信區間有多種計算公式,最常見的是”正態區間”(Normal approximation interval)。但是,它只適用于樣本較多的情況(np > 5 且 n(1 ? p) > 5),對于小樣本,它的準確性很差。
這邊,我推薦用t檢驗來衡量小樣本的數據,可以解決數據過少準確率不高的問題。
這樣一來,排名算法就比較清晰了:
第一步,計算每個case的p(好評率)。
第二步,計算每個”好評率”的置信區間(參考z Test或者t Test,以95%的概率來處理)。
第三步,根據置信區間的下限值,進行排名。這個值越大,排名就越高。
解釋一下,n為評價數,p為好評率,z為對應檢驗對應概率區間下的統計量
比如t-分布:
可以看到,當n的值足夠大時,這個下限值會趨向p,如果n非常小,這個下限值會大大小于p,更加符合實際。
Reddit的評論排名,目前就使用這個算法。國內的化,滴滴也有部分業務涉及,效果也不錯。
除此之外,在計算排名的時候,我們通常會考慮三個事情
- 上文講到的,次數+好評率的分布,次數越多好評率越可靠,好評率越高該項越值得推薦
- 時間因素,如果一個項目是10天前推送的,一個項目是昨天推送的,很明顯前者的次數遠大于后者
- 影響權重,你這邊只考慮了喜歡和不喜歡,其實所有的排序不可能只以1個維度考慮,通常會考慮多個維度,比如瀏覽次數,搜索次數等,你需要考慮每個的重要性或者說權重大小
1這里就不講了,其他方法也有很多,比如貝葉斯平均的優化版本、再比如經典的Hacker公式:
2.時間因素:
時間越久,代表之前的投票結果對當前的影響越小,這邊有很多不同的影響方式,舉幾個例子:
比如艾賓浩斯遺忘規律:
這里的c、k決定下降速度,業務運用過程中,c值一般在[1,2],k值一般在[1.5,2.5]
比如時效衰減:
這里就是比較常見的移動窗口式的,永遠只看近期某一段時間,而且時間內呈線性下降,不過可以改變變化方式
3.不同種的屬性對于結果的影響自然不同
舉個例子,用戶主動搜索和用戶瀏覽相比,用戶主動搜索的情況下,用戶的需求更為強烈
通常需要判斷這些強烈程度都是通過:
- 相關性:看因變量與自變量之間的相關系數,如:cor函數
- importance:看刪除或者修改自變量,對應變量的判斷影響大小,如:randomForest的重要性
- 離散程度:看自變量的數據分布是否足夠分散,是否具有判斷依據,如:變異系數或者pca等等。
End.