1. 程式人生 > >推薦系統的學習筆記

推薦系統的學習筆記

一直以來對推薦系統的學習和理解來自一些機器學習書中簡單介紹(如《集體智慧程式設計》和《機器學習實戰》)和自己網上搜的一些資料。而當被問及對推薦系統的改進和理解,發現自己對推薦系統所知甚少,除了知道幾個常用的演算法外,根本沒有更深入的理解,更別提改進了。本篇部落格為學習《推薦系統》一書的讀書筆記,記錄了常見的推薦演算法和其思想。

ps:推薦系統入門學習可以看蔣凡先生翻譯的《推薦系統》和項量的《推薦系統實踐》。

1協同過濾推薦


協同過濾(Collaborative Filtering Recommendation),這是目前使用的非常廣泛的一個演算法。分為基於使用者的協同過濾演算法和基於物品的協同過濾演算法。

系統思想是:如果使用者在過去有相同的偏好(比如他們瀏覽或買過相同的書),那麼他們在未來也會有相似的偏好。比如,使用者A和B購買經歷非常重疊,而且最近A買了B不知道的一本書,那麼這時的基本邏輯是像B推薦這本書。由於選擇可能感興趣的書涉及到從大量的集合中過濾出最有希望的書,而且使用者是隱式地與其他人相互協作,因此這種技術被稱為協同過濾。

純粹的協同過濾過濾方法不會利用或要求任何有關物品本身的知識,這樣子的優勢是,系統不需要獲取並維護這些資料,其次,使用這些特徵推薦的物品與使用者過去喜歡的物品確實很相似,這樣可能更有效一些。

輸入:使用者-物品評分矩陣

輸出:當前使用者對物品喜歡或不喜歡程度的預測數值,n項推薦物品列表

1.1基於使用者的最近鄰推薦

演算法思想:以給定的評分資料集和當前使用者為輸入,尋找過去與當前使用者有相似偏好的其他使用者(這些使用者有時也稱為對等使用者或者最近鄰),找出後,對當前使用者沒有購買過/見過/使用過的每個商品p,利用其最近鄰進行商品p的評分,以該評分作為預測的當前使用者對這些商品的評分,並將評分高的物品推薦給當前使用者。

一句話:找到跟使用者有相似興趣的其他使用者,將其他使用者感興趣的物品推薦給當前使用者。

假設:1)如果這些使用者們過去有相似的偏好,那麼他們未來也會有相似的偏好;2)使用者的偏好不會隨時間的變化而變化。

1.1.1 計算使用者相似度

尋找與當前使用者相似的使用者需要利用使用者-物品評分矩陣進行使用者相似度計算,以使用者之間的相似度表示使用者之間的相似程度。

使用的演算法有:

Pearson相關係數。注意,皮爾森相關係數即為數學上常用的相關係數。

改進的餘弦函式。

Spearman秩相關係數。

1.1.2 預測使用者評分

選擇與當前使用者最相似的k個使用者作為使用者的近鄰,並使用近鄰和使用者自身平均評分的偏差來計算當前使用者對物品p的預測值。

如果預測列表中有一些物品的預測分值很高,那麼可以將這些分值高的物品推薦給當前使用者。

1.2基於物品的最近鄰推薦

演算法思想:流程類似基於使用者的協同過濾,但是是計算和利用物品之間的相似度。如果商品A和商品B很相似,即購買商品A的使用者群和購買商品B的使用者群重合度很高(A和B被人同時喜歡),那麼A和B商品就很相似,如果發現當前使用者購買過A但是沒有購買過B,於是可以向用戶推薦B商品。

一句話:找到相似的物品,向用戶推薦他沒買過的相似的物品。

1.2.1 相似度計算

改進的餘弦函式。

1.2.2資料預處理

離線構建物品相似度矩陣。

二次取樣

1.2.3評分

協同過濾需要對物品評分。

隱式評分:使用者瀏覽停留時間/購買記錄/點選/播放。

顯示評分:使用者自己評分。

1.3資料稀疏和冷啟動

實際應用中,由於使用者一般只會評價/購買少部分的物品,評分矩陣一般都非常稀疏。此時一般需要利用使用者的附加資訊,如使用者的性別,年齡,教育,興趣等資訊。針對剛上線的推薦系統,當然此時已經不再是純粹的協同方法了。

使用者-物品關係圖,計算路徑距離,擴充套件啟用

預設投票:給評分次數少的物品賦以預設值。

冷啟動:給沒評分過使用者推薦,給沒被評分/被購買過的物體做推薦。解決的辦法也是使用混合的方法(引入額外的資訊)

1.4基於記憶的協同

傳統的基於使用者協同推薦,評分資料都存在記憶體中,直接生成推薦結果,精度高,但是效能和擴充套件性低

1.5基於模型的協同

離線運算,有基於物品的過濾和一些降維技術。

1.5.1矩陣因子分解

使用矩陣因子分解的方法,從評分模式中取出一組潛在的因子,並通過因子向量描述使用者和物品。

基於SVD推薦:將高度相關且一起出現的詞語作為單獨因子

主成成分分析:對評分進行預處理,得到主要方面,以解釋大多數變數

1.5.2關聯規則挖掘

關聯規則挖掘的想法可以移植到協同推薦,將目標換成自動發現規則,比如“如果使用者喜歡物品1和2,那麼他很可能也喜歡物品5”
Apriori

1.6基於概率分析的推薦方法

樸素貝葉斯,計算(預測)使用者在對其他物品評分集合X下對新的物品評分為i的概率。

將相似的物品或使用者進行聚類,計算使用者屬於不同聚類的概率,再結合評分矩陣進行預測。

使用貝葉斯信任網路進行分類條件概率建模

1.7Slope One預測

利用使用者對物品之間的評分差異來計算(預測)新的物品評分。
簡單,使用

最新:概率潛在語義索引(PLSI)
考慮離線模型的連續更新問題。

2基於內容的推薦

推薦與使用者過去喜歡的物品相似的物品。根據物品本身內容的相似度來做推薦,側重於推薦文字描述的物品,並能自己學習使用者記錄。

(基於知識的推薦系統通常是顯示詢問使用者偏好的)

推薦系統也可以看成是解決資訊過載的工具(從大量的集合裡選擇最感興趣的物品),所以,推薦系統的研究也根植於資訊檢索和資訊過濾領域,這些領域主要強調的是區分相關和不相關的文件。

基於內容推薦的核心是能夠得到物品的描述(人工生成/自動抽取),需要得到使用者的記錄(自動抽取/學習,或直接詢問)。

優點:不需要大規模使用者即可達到適度的推薦精度,而且一旦得到物品的屬性就能夠立刻進行推薦新物品。


基於內容推薦系統的一般工作原理是:評估使用者還沒看到的物品與當前使用者過去喜歡的物品的相似程度。

2.1內容表示

維護物品特徵的詳細列表(屬性集,特徵集,物品記錄),對於圖書而言,可以是體裁,作者名,出版社,型別,價格等其他描述資訊

相似度量:Dice係數。

2.1.1向量空間模型,TF-IDF演算法

提取文件內容中的關鍵字。

去停用詞,詞幹還原(對英文?),選擇出資訊量大的詞,使用短語

2.2基於內容的相似度檢索:

  1. 最近鄰

    如kNN,分為短期的最近主題資訊和長期的最有資訊量的詞語。搜尋短期模型和近鄰。搜尋長期~。如來了一組新聞,判斷是否是使用者最近關注的新聞,取相關度最高的來推薦。

  2. 相關性反饋

    rocchio方法。
    給定推薦結果,使用者顯示/隱式(單擊)對結果評分。

2.3其他文字分類方法

2.3.1基於概率模型的方法

將文件按使用者是否喜歡進行分類(樸素貝葉斯,效率高,容易更新),冷啟動(人工標註,使用者填寫興趣)

其他:考慮文件詞頻。

2.3.2其他的分類器

將基於內容的推薦問題看做分類問題,那麼還可以運用其他的機器學習技術。

SVM

2.3.3顯式決策模型

決策樹:內部節點為特徵詞,葉子結點為類別(相關/不相關)。因為基於內容推薦需要使用較大的特徵集合,而決策樹在特徵較多時效果並不好。可以綜合使用,比如先用決策樹找出最相關的使用者模型特徵,再用協同過濾。

隨機森林

規則歸納法:從訓練資料中抽取決策規則。

決策模型的優勢:推匯出的決策規則可以作為生成系統推薦解釋的基礎;已有的先驗領域知識可以整合到模型中。

2.3.4特徵選擇

卡方統計,互資訊,詞頻,資訊熵等。

2.4討論

侷限:在推薦網頁時,僅僅通過文字內容就想決定網頁的質量和偏好可能還不夠,還有其他的因素比如美觀,可用性,超連結的正確性和佈局等也決定了網頁的質量。另外,小文字很難抽取出有區分度的好特徵。

問題:如何考慮非文字因素(視訊,圖片,樣式),從小文字中提取學習特徵困難。

推薦結果缺乏新穎性:例子:推薦了使用者熟知的物品/大路貨。推薦了使用者最近看過的使用者最近看過的相同題材的文章。

獲取評分:冷啟動。需要使用者標註的喜歡和不喜歡的標註集合。

3基於知識的推薦

在電子產品消費領域,會出現大量的單次購買者,系統可能無法依賴購買記錄,沒法應用協同過濾和基於內容的過濾。評分具有時效性,5年前對電腦的評分對基於內容的推薦就不太適合了。對於需求形式化的處理並不是純粹協同過濾和基於內容推薦所擅長解決的。

原因:使用者不會頻繁地購買房子,車子和計算機,使用者要明確定義需求。

基於知識的推薦系統需要利用到當前使用者和有效物品的額外資訊。要滿足使用者提出的特徵,同時,也需要維護使用者模型(確認使用者偏好,如解析度跟重量誰更重要)來提供個性化推薦。


3.1知識表示法和推理

基於知識的系統依賴物品特性的詳細知識。

基於約束的推薦問題一般可以表示為由約束求解的約束滿足問題,或者是資料庫引擎執行並解決的合取查詢形式。

基於例項推薦系統主要利用相似度衡量標準從目錄中檢索商品。

3.1.1約束

約束滿足問題(CSP)。

3.1.2例項與相似度

基於例項推薦:利用相似度,描述物品屬性與某些給定使用者需求之間的匹配程度。

基於效用推薦可以看成是基於知識推薦的一種具體型別。

3.2與基於約束的推薦系統互動

互動過程:

使用者指定自己的最初偏好

有了足夠多的需求和偏好後,提供一組產品,可提供推薦產品的解釋。

使用者進行需求修改,比如看看其他的候選方案,或者減少產品數量。

3.2.1預設設定

推薦預設值:幫助使用者說明需求,尤其是當用戶不清楚該選擇哪個物品或者弄不清某些專業細節時。

靜態預設設定:每個使用者屬性都有這個預設設定。

條件預設設定:根據使用者的潛在需求進行組合確定。

派生預設設定:利用已有的互動日誌自動抽取預設值。

確定預設值的方法:1最近鄰,加權多數投票。

3.2.2處理不滿意的需求和空結果集

放寬問題限制。

3.2.3提出未滿足需求的修改建議

3.2.4對基於物品/效用推薦結果的排序

物品排序根據市多屬性效用理論,依據每個物品對使用者的效用來評價。每個物品會根據事先定義好的維度進行評價。

3.3與基於例項的推薦系統互動

3.3.1評價

使用者以當前待推薦的物品未滿足的目標來指明他們的修改要求。如:當前顯示數碼相機價格太高,使用者就會給出更便宜的評價。

基於例項推薦系統的最新進展整好了基於查詢和基於瀏覽的物品檢索。一方面評價有助於在物品集合內有效地引導使用者;另一方面,基於相似度的例項檢索有助於識別最相似的物品。

3.3.2混合評價

允許使用者在多個屬性進行評價,提高了互動效率,減少了評價週期

3.3.3動態評價

用到正規化。每一輪的評價是實時產生的。計算動態評價用到關聯規則挖掘。

4基於效用推薦

基於效用的推薦(Utility-based Recommendation)是建立在對使用者使用專案的效用情況上計算的,其核心問題是怎麼樣為每一個使用者去建立一個效用函式,因此,使用者資料模型很大程度上是由系統所採用的效用函式決定的。基於效用推薦的好處是它能把非產品的屬性,如提供商的可靠性(Vendor Reliability)和產品的可得性(Product Availability)等考慮到效用計算中。

5混合推薦方法

(加權,組合,並行,序列)

6推薦系統解釋

7評估推薦系統

內在有效性:指的是在受控測試條件下觀察到的效果程度。

外在有效性:推廣到其他其他使用者群或環境的效果程度。

利用歷史資料集進行評估,交叉驗證。

點選率,準確率,召回率,MAE(平均絕對誤差),ROC等

8針對協同推薦系統的攻擊

攻擊的記錄插入代價;攻擊是否是針對特定演算法設計的;攻擊是否具有可識別性。

隨機攻擊;均值攻擊;造勢攻擊;區域性攻擊;針對性的打壓攻擊;點選流攻擊和隱式反饋(針對協同過濾等基於使用者點選的推薦系統,使用爬蟲等模擬點選訪問一些物品,構造虛假的使用者瀏覽記錄,這種記錄會干擾協同過濾的推薦,影響最近鄰使用者的選擇)

對策:使用基於模型的技術和額外的資訊(儘量採用不是隻依賴評分資訊的推薦系統);提高插入成本;自動探測攻擊。

使用分散式協同過濾,為了保護使用者隱私可以使用資料擾動(對使用者的評分資料進行模糊,但是不妨礙進行有意義的計算)

9線上消費決策

環境效應,折中效應,非對稱的優勢效應,吸引效應;首位/新近效應;其他效應

個性和社會心理學,控制點,結束的需求,最大者和滿意者,從眾,信任,情感說服。

10推薦系統和下一代網際網路

基於信任網路的推薦系統

大眾分類法:基於標籤雲的推薦

11普適環境中的推薦

上下文感知推薦,考慮時間地點同伴,移動領域。

12幾個問題

我這邊有兩個問題,一個是與學長聊天時想的,一個是遇到的一道筆試題。

12.1問題

網易雲音樂每天都會生成n首音樂推薦,請問,你覺得系統該如何設計進行這種個性化推薦?

首先要有一個離線和線上的推薦模型。

離線模型主要是應用推薦演算法離線生成每個使用者的個性化音樂列表,比如一次生成x首,x大於n。

而線上模型主要是當用戶在實時使用過程中根據使用者的反饋進行個性化音樂列表的修改(比如使用者在聽的過程中對某一種型別的音樂選擇了不喜歡,那麼個性化推薦列表就該刪除這種型別的音樂,隨之用離線的x首未選中的排名靠前的不是這類音樂的歌單替換)。

使用者模型資訊的獲取,我覺得應該有使用者聽過的歌單列表及其播放次數,使用者搜尋/瀏覽/檢視過某歌曲記錄,使用者收藏、喜歡的歌單和歌手,使用者點選過喜歡和不喜歡的歌曲型別記錄,使用者好友記錄。

對於離線推薦演算法,我覺得應該是一個混合的推薦過程。其中應該有基於使用者的協同過濾,即考慮與使用者有相同愛好的其他使用者,選擇其他使用者喜歡聽的音樂而當前使用者還沒聽過,則加入推薦列表。應該有基於歌曲的協同推薦,找出與使用者喜歡聽的音樂非常相似的音樂(主要利用使用者-歌曲評分矩陣),這裡可以使用一些降維技術,可以應用關聯規則推薦等,然後將這些音樂加入到推薦列表。

基於內容的推薦。利用歌曲本身的資訊(如旋律變化,歌詞,使用的樂器等)來計算與當前使用者喜歡的音樂相似度較高的音樂,然後選擇相似度高的音樂加入推薦歌單。
將推薦看成是分類問題,使用LR,貝葉斯,SVM,RF等分類器進行使用者是否喜歡某首音樂的分類作為推薦。

考慮短期模型和長期模型,在上面的推薦演算法中考慮短期模型和長期模型,短期模型指的是使用者最近一段時間喜歡聽的,新加入收藏歌單的一些歌或者歌手,找出這些歌曲的相似歌曲進行推薦,長期模型指的是使用者在較長的歷史期間都喜歡聽的一些歌手,歌曲,找出這些歌曲的相似歌曲進行推薦。

組合推薦,考慮上面提及的幾種推薦方式,在一起選擇一種混合的方式進行推薦。

按照上面的演算法能夠生成一個歌單,設生成了x首,x可能比較大,此時要選擇前n首作為推薦歌單,而不能講所有x首音樂全顯示給使用者了,一方面使用者一次性聽不了這麼多首音樂,另一方面使用者看到太多的列表可能也不會點太多,也方便頁面佈局,最後我們只需要推薦使用者最喜歡的幾首歌就行了,而排名靠後的音樂預測使用者喜歡的程度可能沒那麼高。

12.2問題

你用過的推薦系統覺得有什麼弊端,請提出自己的改進。

還是以網易雲音樂為例,我覺得它的推薦不夠多樣性。如果我喜歡聽A,B和C三種類型的歌曲,則網易雲音樂幾乎每天都會給我推薦這些型別下的歌曲。這樣長期以往,如果我沒有在網易雲音樂上點選過或收藏過其他型別的歌曲,那麼我的歌曲推薦將一直侷限在一個目前這個歌曲型別中。而事實上,我可能也喜歡聽D,E和F型別的歌曲,只是我現在沒有聽過,沒準聽了就喜歡了。
改進是,在主體保證推薦準確度的情況下,按照某種策略逐漸嘗試推薦不同型別的歌曲給使用者,如偶爾推薦給使用者其他領域較為熱門的歌曲混入每日歌單中。

以上問題的想法均屬個人瞎想,如果您有意見請不吝指出。