本文是筆者閱讀《推薦系統實戰》後的一篇讀書筆記,包括了筆者的一部分淺顯思考。書質量很是不錯,有問題歡迎指正!算法
推薦系統通常有兩種:一種是預測用戶評分,另外是給出TopN,但後者會更頻繁更有用。由於預測分數並不能怎麼樣。「重點是他看了,而不是評價」。下面都以TopN爲主。網絡
衡量推薦系統有四個基本指標:機器學習
更高級別的:性能
如今主流推薦算法都有馬太效應:強者越強,弱者越弱,會形成基尼係數的進一步提高。學習
用戶購買的物品,能夠記作矩陣。就有了ItemCF和UserCF,即經常使用的協同過濾。簡單說,購買了類似物品的用戶越類似,被用戶同時購買的商品更類似。網站
對大部分東西的熱度曲線,都呈現長尾效應:指數曲線。佔20%的物品佔據了80%的流量。越是重度用戶,越會關心那些冷門的信息。spa
UserCF的推薦更社會化, 反映了用戶在小型團體中興趣的程度;和本身類似的人喜歡的,本身也喜歡。 ItemCF的推薦更個性化,反映了用戶本身的興趣:必定會喜歡購買相似的商品。設計
算法看似簡單,但都有共同的問題,好比物品和物品是不一樣的,新華字典的信息量確定沒有《機器學習》來得大;人和人也是不一樣的,一個書商購書行爲,也和普通的文藝青年有所區別。所以,須要特別去調整頻繁用戶/物品的權重,避免污染整個數據集。日誌
另外,若是物品特別多或更新頻繁,就去更新用戶矩陣。而若用戶特別多,則可用物品矩陣。簡而言之,沒有最合適的方法,都須要根據具體業務場景來定義規則。排序
K值越大,須要考慮的用戶和商品就越多,顯然,對UserCF,能夠提高覆蓋率,但不必定能提高召回。對ItemCF, K越大會下降覆蓋率(爲何?)。
選擇一個合適的K很重要。ItemCF的好處是其可解釋性。
簡單說,若是用戶以前喜歡科技類書籍,那麼就能夠給他打標籤,科技,以後便可推薦科技類書籍。
但問題是:
這就是隱語義,能夠經過相似聚類的方法,將Item作分類,但標籤不必定是可解釋的,也就是所謂的「隱」,即LFM。
LFM經過以下公式計算用戶對某個商品的興趣:
$Preference= p_u^Tq_i = \sum_(p_(u,k))^(i_(k,u)) $
分爲兩步, 其中\(P_(u,k)\) 度量了用戶u的興趣和k個隱變量的關係, \(q_(i,k)\) 度量了k個隱變量和商品i的關係。相似傳導。很像SVD分解後的S矩陣和D矩陣。
這基本上把它當成了打分的問題(分類),可是負樣本從哪裏來?一些網站可經過「踩」表達負向,但不少時候只有正向。 負向可經過採樣實現,比較好的實踐方法:
以後便可經過SGD最小化均方偏差(SGD簡直萬能)。LFM比ItemCF和UserCF效果都好,但樣本稀疏時,可能效果就不如了。另外,提高負樣本的比率可有效提高系統的準確率和召回率。
ItemCF和UserCF都只考慮了一層關係,但朋友的朋友若是也喜歡同樣東西是否是我也會喜歡它呢?基於圖的算法,比那幾種考慮的更多。固然,計算量也更大。
方法是隨機遊走,將i和u都當作圖上的點,有必定的機率轉移和停頓,則通過屢次迭代,每一個節點被訪問到的機率會逐漸趨於定值。稱做PersonalRank算法。
可是,計算量太大,方法就是求逆矩陣。
當系統剛剛創建,數據並不徹底,所以不少計算沒法實施,尤爲是ItemCF。
兩種解決辦法:
註冊時提交喜愛信息,構建成最適合分類的二叉樹,從而快速肯定用戶的基本興趣。
註冊時提供基本信息,系統可根據性別/年齡和國籍來進行初步推薦。
對商品進行分類,利用商品特徵,作出關鍵詞向量,開發線性分類器。向量空間模型的特色是簡單容易實現,但卻丟失了一些信息。 相比於協同過濾,它的性能低不少。
可是這也不必定,好比GitHub,可能會fork同一個做者的多個項目,所以將做者做爲特徵,能夠很是強地模擬協同過濾。
LDA也能夠對話題作出分類,這種方法比向量空間模型更爲高級,可是其內部的數學原理,還需挖掘(待學習)。
另外是專家系統,經過專家對不一樣維度進行打標,解決冷啓動,這也有不少成功的案例。若是item較少,這種方式是很可行的。
冷啓動表明了一系列問題,處理它須要必定的經驗。
先理清UGC的概念,是User Generated Content的簡稱。標籤是一種經常使用的方法,便於解釋,用戶可以方便地爲商品打標,提高用戶互動。
通常來講,標籤能夠由系統自動產生(NLP),也能夠由用戶手工添加,包括如下類型:做者,主題,時間,評價,是否喜好等。
統計用戶最經常使用的標籤,對每一個標籤,統計被打過這些標籤的最多的商品,而後把這些商品推薦給用戶。
標籤會隨着系統發展,變得愈來愈多。所以類似的標籤須要合併,不合理的標籤要去掉,太過廣泛的標籤會被降權。
若是用戶給的標籤太少,則能夠在已有的標籤上,給出更多新的標籤。
標籤至關因而個紐帶。一樣標籤也能被推薦,方法也很簡單。
用戶在不一樣場景下,心情是不一樣的。所以行爲和音樂確定也有所區別。實時性很是重要,此時,推薦系統變成了時變系統。
當用戶對某個物品發生了點擊時,就會觸發一次推薦的更新,這種實時迴流很是重要。是如何實現的呢?
顯然維基百科和youtube的物品時變速率大大不一樣。新聞比電影的時變性更強。判斷系統時變性有兩種方法,T天以內,天天和前一天該物品的特徵向量求類似度數值,能夠掃出一條曲線。
最簡單的,在推薦列表中,一部分是推薦的,一部分是隨機的。
當用戶看過某件商品,就會對其作降權。不少推薦系統沒法獲得更多的迴流數據,致使重複推薦。
每次都使用不一樣的推薦算法來推薦。
最近的行爲,對此次的類似度貢獻要比更早的行爲更多。
固然,推薦系統要首先保證精度,再考慮推薦的實時性。
一些場景對地點很敏感,例如餐館商場等。本地新聞也會提高用戶的粘性。這個問題比較複雜,有一些方法能解決這個問題:
設計多層分類器,例如江蘇南京用戶,先對總體用戶作推薦,再對中國用戶推薦,再對江蘇,最後是南京,幾種模型進行疊加,最終生成結果。但問題是到分類樹的枝杈時,數據已經很是稀疏了。
包括三個部分:UI,日誌系統和推薦系統。
三個級別: 用戶,特徵,商品。先從用戶生成特徵,再經過特徵找到商品。
三個步驟: 推薦,過濾,排序。
多個推薦系統能夠進行投票,最終能夠作推薦系統的推薦系統,按照不一樣用戶的需求生成推薦
新聞有其獨特的特色: 不斷有新文章進來,以後又不斷過時。實時性很高。ItemCF彷佛不可行。
用戶會喜歡多個類目,但一旦熱門新聞過來,門類反而不重要了。甚至一些觀點認爲,天天最熱門的物品已經吸引了絕大多數用戶的眼球,長尾物品不多獲得用戶關注。
而新聞自己的質量很是重要。一般好文章的閱讀數遠大於其餘文章(長尾效應,二八原則)
若是沒有社交信息,UserCF就也變得不可靠了。
須要對文章的做者提供適當的保護,不然馬太效應明顯。
擁有衆多埋點行爲可供參考,例如該頁面停留時間,用戶滑動行爲,點擊/點贊/踩。
從整本書,咱們可以分析一些通用的思路。
經過向量能夠計算類似度,用共現可計算關係。可是,須要對熱門u或i作懲罰,TF/IDF是個很好的思路。它不只能用於詞彙,還能用於各類離散化的,對順序無要求的系統中。
計算一個網絡中多個節點的關係,能夠用PersonalRank來實現,即隨機遊走。隨機遊走須要定義啓動機率,通常是相同的。這種算法的好處,是可以評估橫跨多個節點的弱關係。雖然圖距離較遠,但由於路徑權重較大,頗有可能距離比直接節點還要近。
推薦系統是與人打交道的系統,如何提高交互的質量很是重要,例如可解釋性。系統設計人員須要對業務有深刻的瞭解,例如電商推薦,商品的降價信息可能會極大地影響推薦的效果。但這個特徵彷佛被忽視了。
太過複雜的算法,效果可能不必定好,由於可能沒法知足實時性要求。或是在工程上成本過高,反而抵消了複雜算法實現的效果。
爲何推薦系統會發布那麼多論文,由於這裏可變的參數實在太多了,而使用的環境又變幻無窮,上下文也會改變,很是適合大量的水論文。