推荐系统笔记(近邻推荐)
思維導圖:
? ? ? ? ? ? ? ? ? ? ??
提到推薦系統,協同過濾算法是最出名啦,協同過濾的重點在于協同,也就是群體互幫互助,互相支持是集體智慧的體現
協同過濾:
? ? ? ? ?當推薦系統度過使用基于內容的推薦階段后,就有了可觀的用戶行為,這時候用戶行為是正向的,也就是用戶或明或暗地表達著喜歡的行為。這些行為可以表達成一個用戶和物品的關系矩陣,這個用戶物品的關系矩陣中填充的就是用戶對物品的態度,但并不是每個位置都有,需要的就是把那些還沒有的地方填起來,這個關系矩陣就是協同過濾的基礎,一切都圍繞這個矩陣進行。
協同過濾是一個比較大的算法范疇,通常劃分為兩類:
1、基于記憶的協同過濾
簡單的理解就是記住每個人消費過什么東西,然后給他推薦相似的東西,或者推薦相似的人消費的東西
? ? 1)基于用戶的協同過濾(User-Based)
? ? ? ?思想:你遇到一個人,你發現他喜歡的電影、喜歡的運動基本上都是你喜歡的,從此,你經常問他有什么好東西可以推薦的
? ? ? ?原理:基于用戶的協同過濾,核心就是那個用戶物品的關系矩陣
? ? ? ?具體實現步驟:
? ? ? ?第一步,準備用戶向量,從這個矩陣中,理論上可以給出每一個用戶得到的一個向量(向量具備的特點:向量的維度就是物品的個數;向量是稀疏的,也就是說并不是每個維度上都有數值;向量維度上的取值可以是簡單的0或1)
? ? ? ?第二步,用每一個用戶的向量,兩兩計算用戶之間的相似度,設定一個相似度閾值或者設定一個最大數量,為每個用戶保留與其最相似的用戶
? ? ? 第三步,為每一個用戶產生推薦結果
? ? ? 實踐中遇到的坑:
? ? ? ?1)只有原始用戶行為日志,需要從中構造矩陣,怎么做?
? ? ? ? ? 構造矩陣做協同過濾時,矩陣是稀疏的,典型的稀疏矩陣存儲格式:CSR、COO
? ? ? ?2)如果用戶的向量很長,計算一個相似度則耗時很久,怎么辦?
? ? ? ? ?通常采取降低相似度計算復雜度,常用的辦法主要有兩個:1、對向量采樣計算? ? 2、向量化計算
? ? ? ?3)如果用戶量很大,而且通常如此,兩兩計算用戶相似度也是一個坑,怎么辦?
? ? ? ? 第一個方法是將相似度計算拆成MapReduce任務,將原始矩陣Map成鍵為用戶對,值為兩個用戶對同一個物品的評分之積,Reduce階段對這些成集再求和,MapReduce任務結束后再對這些值歸一化
? ? ? ?第二個方法是不用基于用戶的協同過濾,這種計算對象兩兩之間的相似度的任務,如果數據量不大,一般來說不超過百萬個,然后矩陣又是稀疏的,那么很多單機版本的工具其實更快,比如KGraph、GraphCHI等
? ? ? ?4)計算推薦時,看上去要為每一個用戶計算他和每一個物品的分數?
? ? ? 針對幾個特點可以利用一下:1、只有相似的用戶喜歡過的物品需要計算,這個數量相比全部物品少了很多 2、把計算過程拆成MapReduce任務,拆Map Reduce任務的做法是:1)遍歷每個用戶喜歡的物品列表? 2)獲取該用戶的相似用戶列表 3)把每一個喜歡的物品Map成兩個記錄發射出去,一個是鍵為<相似用戶ID,物品ID,1> 三元組,可以拼成一個字符串,值為相似度,另一個鍵為<相似用戶ID,物品ID,0>三元組,值為<喜歡程度*相似度>? ?4)Reduce階段,求和后輸出? ?5) <相似用戶ID,物品ID,0>的值除以<相似用戶ID,物品ID,1>的值
? ? ? ? 一些改進:懲罰對熱門物品的喜歡程度,熱門的東西很難反應出用戶的真實興趣,很大可能是被煽動;增加喜歡成都的時間衰減,一般使用一個指數函數,指數就是一個負數
? ? ? ? ?應用場景:基于用戶的協同過濾的應用場景,基于用戶的協同過濾有兩個產出:相似用戶列表;基于用戶的推薦結果
? ? 2) 基于物品(Item-Based)的協同過濾
? ? ? ?在基于物品協同過濾出現之前,信息過濾系統最常使用的是基于用戶的協同過濾。基于用戶的協同過濾首先計算相似用戶,然后再根據相思用戶的喜好推薦物品,這個算法有幾個問題:1)用戶數量往往比較大,計算起來比較吃力,稱為瓶頸? 2)用戶的口味其實是變化很快的,不是靜態的,所以興趣遷移問題很難反應出來 3)數據稀疏,用戶和用戶之間有共同的消費行為實際上是比較少的,而且一般是一些熱門物品,對發現用戶興趣幫助不是很大。
? ? ? ?與基于用戶的不同,基于物品的協同過濾首先計算相似物品,然后在根據用戶消費過、或者正在消費的物品為其推薦相似的。
? ? ? ?首先,物品的數量或者嚴格的說,可以推薦的物品數量往往少于用戶數量,所以一般計算物品之間的相似度不會稱為瓶頸
? ? ? ?其次,物品之間的相似度比較靜態,它們的速度沒有用戶的口味變化快,所有完全解決用戶興趣遷移的問題
? ? ? ?最后,物品對應的消費者數量較大,對于計算物品之間的相似度稀疏度是好過計算用于之間相似度的
? ? ? ?基于物品的協同過濾算法主要步驟如下:1)、構建用戶物品的關系矩陣,矩陣元素可以是用戶的消費行為,也可以是消費后的評價,還可以是消費行為的某種量化如時間、費用等 2)、假如矩陣的行表示物品,列表示用戶的話,那么兩兩計算行向量之間的相似度,得到物品相似度矩陣,行和列都是物品? 3)、產生推薦結果,根據推薦場景不同,有兩種產生結果的形式,一種是為某一個物品推薦相關物品,另一種是在個人首頁產生類似猜你喜歡的推薦結果。
? ? ? ?計算物品相似度:從物品關系矩陣中得到的物品向量是一個稀疏向量;向量的維度是用戶,一個用戶代表向量的一維,這個向量的總共維度是總用戶數量;向量的各個維度的取值是用戶對這個物品的消費結果,可以是行為本身的布爾值,也可以是消費行為量化如時間長短、次數多少、費用大小等;沒有消費過的就不再表示,所以說是一種稀疏向量
? ? ? 一些改進:
? ? ? ? ? 1、物品中心化。把矩陣中的分數,減去的是物品分數的均值;先計算每一個物品收到評分的均值,然后再把物品向量中的分數減去對應物品的均值
? ? ? ? ? ?2、用戶中心化。把矩陣中的分數,減去對應用戶分數的均值;先計算每一個用戶的評分均值,然后把他打過的所有分數都減去這個均值
? ? ? ? ? 上面提到的相似度計算方法,不只是適用于評分類矩陣,也適用于行為矩陣。所謂行為矩陣,即矩陣元素為0或1的布爾值,也就是隱式反饋,隱式反饋取值特殊,有一些基于物品的改進推薦算法無法應用,比如著名的Slope One算法
? ? ?計算推薦結果
? ? ? ? ? ? 得到物品相似度之后,接下來就是為用戶推薦他可能會感興趣的物品,基于物品的協同過濾,有兩種應用場景
? ? ? ? 第一種屬于TopK推薦:當用戶訪問首頁時,匯總和用戶已經消費過的物品相似的物品,按照匯總后分數從高到低推出
? ? ? ? 第二種屬于相關推薦:當用戶訪問一個物品的詳細頁面時或者完成一個物品消費的結果時,直接獲取這個物品的相似物品推薦
2、基于模型的協同過濾
從用戶物品關系矩陣中去學習一個模型,從而把那些矩陣空白處填滿
協同過濾中相似度的計算方法:
相似度的本質:推薦算法實際有一個潛在假設,如果兩個物體很相似,也就是距離很近,那么這兩個物體很容易產生一樣的動作
相似度計算方法:
? ? ?1、數據分類:在計算相似度之前,需要先把度量對象做個簡單分類,相似度計算對象是向量,或者是高維空間下的坐標,表示向量的數值就有兩種:1、實數值? ?2、布爾值,也就是0或者1
? ? ?2、歐式距離:是一個歐式空間下度量距離的方法,衡量兩個點之間的距離。歐式距離不適合布爾向量之間
? ? ?3、余弦相似度:度量兩個向量之間的夾角,其實就是用夾角的余弦值來度量。
? ? ? ? ? 余弦相似度在度量文本相似度、用戶相似度、物品相似度較為常用,余弦相似度的特點是它與向量的長度無關,因為余弦相似度計算需要對向量長度做歸一化。
? ? ? ?一些改進:調整的余弦相似度,就是先計算向量每個緯度上的均值,然后每個向量在各個維度上都減去均值后,再計算余弦相似度
? ? 4、皮爾遜相關度
? ? ? ? ? 也是一種余弦相似度,不過先對向量做了中心化 ,在計算余弦相似度。不適合做布爾值向量之間的相關度(因為布爾向量對應0-1分布的隨機變量,這樣的隨機變量變化只有有限的兩個取值,根本沒有‘變化趨勢,高低起伏’)
? ? 5、杰卡德(Jaccard)相似度
? ? ?表示兩個集合德交集元素個數在并集中所占德比例,由于集合非常適用于布爾向量表示,所以杰卡德相似度簡直就是為布爾值向量私人定做的。對應德計算方式是:1、分子是兩個布爾向量做點積運算,得到的就是交集元素個數? 2、分母是兩個布爾向量做或運算,再求元素和。
比較:按照向量維度取值是否是布爾值來看,杰卡德相似度就只適合布爾值向量,余弦相似度適用于兩種向量,歐式距離適合非布爾值向量。
總結
以上是生活随笔為你收集整理的推荐系统笔记(近邻推荐)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统笔记(内容推荐)
- 下一篇: 传统图像理解