1 推薦系統基礎##
1.1 個性化推薦概述###
1.1.1 推薦系統概述
首先,需要申明一點的就是推薦系統!=推薦算法。推薦系統是一套完善的推薦機制,包括前期數據的準備、具體推薦的過程(這個過程可能是一套復雜的算法模型,也可能是一個簡單的規則,也可能是多種模型的混合結果等等)、后期數據的預測、AB測試效果評估等等。
1.1.2 推薦算法模型概述
在算法模型上大體可以分:基于內容的推薦、基于協同過濾的推薦。
基于內容推薦,即通過內容本身的屬性,然后計算內容的相似性,找到與某物品屬性相似的物品。協同過濾,所謂協同過濾,即不依賴于物品本身的物品屬性,而是通過其他相關特征,例如人參與的行為數據,來達到推薦物品的目的。
關于協同過濾,又分為以下幾個類別:基于物品的協同,即ItemCF;基于用于的協同,即UserCF;基于模型的協同,即ModelCF。
其中,基于模型的協同又可以分為以下幾種類型:基于距離的協同過濾;基于矩陣分解的協同過濾,即Latent Factor Model(SVD);基于圖模型協同,即Graph,也叫社會網絡圖模型。
1.2 基于內容的推薦###
其實但從字面上也好理解,其推薦的依據為物品的內容,即物品的具體相關屬性。換言之,即我們希望找到的是跟當前物品相似的物品。
那么,我們的目標就明確了,計算當前物品與其他物品的相似度,然后生成一個相似TopN列表,然后想要多少個推薦多少個。
通常我們會有以下兩種方式來計算相似度:通過物品間的距離去度量相似;通過直接計算相似度。
1.2.1 計算物品距離的幾種方法
(1) 歐幾里得距離(Euclidean Distance)
最常見的距離度量方式,衡量多維空間中兩點之間的絕對距離,要求維度的統一。
(2) 明可夫斯基距離(Minkowski Distance)
明氏距離是歐氏距離的擴展,是對多個距離度量公式的概括性的表述(可以看到,當p=2時,其實就是歐式距離)。
(3) 曼哈頓距離(Manhattan Distance)
曼哈頓距離來源于城市區塊距離,是將多個維度上的距離進行求和后的結果,即當上面的明氏距離中p=1時得到的距離度量。
還有其他的一些距離度量,但是都不太常用,最常用的依然是歐式距離度量。
1.2.2 計算相似度量的幾種方法
(1) 向量空間余弦相似度(Cosine Similarity)
余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。
(2) 皮爾森相關系數(Pearson Correlation Coefficient)
即相關分析中的相關系數r,分別對X和Y基于自身總體標準化后計算空間向量的余弦夾角。
基于內容的推薦,還有一點需要注意的就是,對于物品自身屬性,如果屬性值過少,我們需要適當進行擴大維度,如果維度過多,則需要進行降維。
關于降維和升維,都是一個很大的研究方向,大體上可以說一下幾種常見的方式。例如降維,我們可以進行維度聚類、主題抽取,進一步把相關維度進行合并,進一步減少維度;而對于升維,我們可以把維度進行矩陣化,例如假設物品X有A和B兩個維度屬性,那么我們通過生成AB矩陣的方式,把維度擴充到AB個維度。
1.3 基于協同過濾的推薦###
1.3.1 基于用戶的協同(UserCF)
基于用戶的協同過濾,即我們希望通過用戶之間的關系來達到推薦物品的目的,于是,給某用戶推薦物品,即轉換為尋找為這個用戶尋找他的相似用戶,然后相似用戶喜歡的物品,那么也可能是這個用戶喜歡的物品(當然會去重)。
來看一個表格:
用戶/物品 物品A? 物品B? 物品C? 物品D
用戶A? ? ? ? Y? ? ? ? ? ?? ? ? ? Y? ? ? ? ? ?
用戶 B? ? ? -? ? ? ? ? Y? ? ? ? ? –
用戶C? ? ? ? Y? ? ? ? ? -? ? ? ? ? Y? ? ? ? ? Y
其中Y表示對應用戶喜歡對應物品,-表示無交集,?表示需不需要推薦。
這是一個最簡單的例子,其實目的很簡單,我們需要給用戶A推薦物品,而且可以看到,用戶已經喜歡了物品A和物品C,其實剩下也就B和D了,要么是B,要么是D。
那么根據UserCF算法,我們先計算用戶A與用戶BC之間的相似度,計算相似,我們前文說了,要么距離,要么余弦夾角。
假如我們選擇計算夾角(四維):cosAB=0(90度的夾角),cosAC=0.8199(角度自己算吧)。所以相比來說,我們會發現用戶A與用戶C的相似度是稍微大一些的。于是,我們觀察用戶C都喜歡了哪些物品,然后與用戶的去重,然后會發現該給用戶A推薦物品D。
簡單來講,UserCF就是如上過程,但在實際的過程中,數據量肯定不止這么點,于是我們需要做的是為用戶計算出相似用戶列表,然后在相似用戶中經過去重之后,計算一個推薦的物品列表(在計算推薦物品的時候,可以疊加用戶的相似程度進一步疊加物品的權重)。
然后在喜歡物品的表達形式上,可以是如上的這種二值分類,即Yes Or No,也可以是帶有評分的程度描述,比如對于某個物品打多少分的這種表現形式。這樣的話,針對于后一種情況,我們就需要在求在計算相似度時,加入程度的權重考量。
1.3.2 基于物品的協同(ItemCF)
不同于基于用戶的協同,這里,我們計算的是物品之間的相似度,但是,請注意,我們計算物品相似度的時候,與直接基于物品相似度推薦不同是,我們所用的特征并不是物品的自身屬性,而依然是用戶行為。
用戶/物品物品A物品B物品C
用戶AY-Y
用戶BYYY
用戶CY??
其中Y表示對應用戶喜歡對應物品,-表示無交集,?表示需不需要推薦。
同樣,這是一個簡單實例。目的也明確,我們在知道用戶AB喜歡某些物品情況,以及在用戶C已經喜歡物品C的前提下,為用戶C推薦一個物品。
看表格很簡單嘛。只有兩個選項,要么物品B,要么物品C。那么到底是物品B還是物品C呢?
我們來計算物品A與其他兩種物品的相似度,計算向量夾角。對于用戶A,物品A與物品B,則對于AB向量為(1,0),(1,1),對于AC向量為(1,1),(1,1),分別計算夾角cosAB=0.7,cosAC=1。或者用類似關聯規則的方法,計算兩者之間的共現,例如AB共現1次,AC共現2次。通過類似這種方式,我們就知道物品A與物品C在某種程度上是更相似的。
我要說的就是類似共現類做計算的這種方式,在大規模數據的情況下是很有效的一種方式,基于統計的方法在數據量足夠的時候,更能體現問題的本質。
1.3.3 基于模型的協同(ModelCF)
除了我們熟悉的基于用戶以及基于物品的協同,還有一類,基于模型的協同過濾。基于模型的協同過濾推薦,基于樣本的用戶偏好信息,訓練一個模型,然后根據實時的用戶喜好信息進行預測推薦。
常見的基于模型推薦又有三種:最近鄰模型,典型如K最近鄰;SVD模型,即矩陣分解;圖模型,又稱為社會網絡圖模型。
(1) 最近鄰模型
最近鄰模型,即使用用戶的偏好信息,我們計算當前被推薦用戶與其他用戶的距離,然后根據近鄰進行當前用戶對于物品的評分預測。
典型如K最近鄰模型,假如我們使用皮爾森相關系數,計算當前用戶與其他所有用戶的相似度sim,然后在K個近鄰中,通過這些相似用戶,預測當前用戶對于每一個物品的評分,然后重新排序,最終推出M個評分最高的物品推薦出去。
需要注意的是,基于近鄰的協同推薦,較依賴當前被推薦用戶的歷史數據,這樣計算出來的相關度才更準確。
(2) SVD矩陣分解
我們把用戶和物品的對應關系可以看做是一個矩陣X,然后矩陣X可以分解為X=A*B。而滿足這種分解,并且每個用戶對應于物品都有評分,必定存在與某組隱含的因子,使得用戶對于物品的評分逼近真實值,而我們的目標就是通過分解矩陣得到這些隱性因子,并且通過這些因子來預測還未評分的物品。
有兩種方式來學習隱性因子,一為交叉最小二乘法,即ALS;而為隨機梯度下降法。
首先對于ALS來說,首先隨機化矩陣A,然后通過目標函數求得B,然后對B進行歸一化處理,反過來求A,不斷迭代,直到A*B滿足一定的收斂條件即停止。
對于隨機梯度下降法來說,首先我們的目標函數是凹函數或者是凸函數,我們通過調整因子矩陣使得我們的目標沿著凹函數的最小值,或者凸函數的最大值移動,最終到達移動閾值或者兩個函數變化絕對值小于閾值時,停止因子矩陣的變化,得到的函數即為隱性因子。
使用分解矩陣的方式進行協同推薦,可解釋性較差,但是使用RMSE(均方根誤差)作為評判標準,較容易評判。
并且,我們使用這種方法時,需要盡可能的讓用戶覆蓋物品,即用戶對于物品的歷史評分記錄需要足夠的多,模型才更準確。
(3) 社會網絡圖模型
所謂社會網絡圖模型,即我們認為每個人之間都是有聯系的,任何兩個用戶都可以通過某種或者多個物品的購買行為而聯系起來,即如果一端的節點是被推薦用戶,而另一端是其他用戶,他們之間通過若干個物品,最終能聯系到一起。
而我們基于社會網絡圖模型,即研究用戶對于物品的評分行為,獲取用戶與用戶之間的圖關系,最終依據圖關系的距離,為用戶推薦相關的物品。
目前這種協同推薦使用的較少。
1.4 其他相關知識###
1.4.1 冷啟動
所謂冷啟動,即在推薦系統初期時,沒有任何用戶與物品的交集信息,即無用戶的行為軌跡,無法通過類似協同的方式進行過濾推薦,這種時候,我們就稱推薦系統處于冷啟動狀態。
這種情況,我們需要盡快的累積起第一批用戶行為軌跡。我們可以通過基于內容的推薦,或者做一些其他類似的操作,快速有效的進行物品推薦。
一段時間后,累積到一定的用戶行為時,整個系統就能夠正常使用協同過濾等方式進行推薦了。
但是,針對于新加入的用戶,或者新加入的物品,同樣也是出于冷啟動狀態的,這個時候,我們通過需要對這種物品或者用戶做特殊的處理。
1.4.2 長尾效應/馬太效應
所謂長尾效應,在推薦系統中的體現即,部分優質物品,購買的人數較多,即與其相關的的用戶行為軌跡會較多。
這樣,在協同過濾推薦中,由于我們主要的依據就是我們的歷史行為行為數據,所以這種物品得到推薦的機會就越多。
這樣,不斷循環迭代,得到推薦的物品都集中在少數的一些物品中,而大部分物品是沒有被推薦的機會的。
這就造成了造成長尾現象。
而馬太效應的意思是,通俗點說就是,強者愈強,弱者愈弱。而長尾的直接體現就是馬太效應。
通常來講(當然也有特殊情況),一個推薦系統,如果長時間處于長尾之中,就會造成推薦疲勞,推薦的效果就會下降。
所以,很多時候,挖掘長尾是推薦系統不可缺少的部分。即,我們需要把尾巴部分 并且是有價值的部分給適當的展示出來。
挖掘長尾的方法很多,其中一種常見的方式就是給熱點物品適當的降權。比如物品,我們為熱點物品進行權重下降,這樣在最終推薦的結果中,非熱點物品得到推薦的機會就增大,從而適當的挖掘了長尾。
1.5.3 AB分流測試
對于推薦系統來說,離線的評測其實并不能很準確的判斷一個推薦算法的好壞。最準確的判斷應該是線上實際效果觀察。
而AB測試是推薦系統評測的標準做法,即我們在線上同時運行兩種算法模型,讓流量分別走不通的算法,最終通過收集結果數據進行比較算法的優劣。
通過AB測試必須滿足以下幾個條件:流量必須能夠控制,這是為了保證線上效果的穩定性;必須保證流量的隨機性,這樣的結果才具有說服力。
X 參考資料
《淺談矩陣分解在推薦系統中的應用》http://blog.csdn.net/sun_168/article/details/20637833
《基于ALS算法的簡易在線推薦系統》http://blog.csdn.net/zhangyuming010/article/details/38958419
《Databricks孟祥瑞:ALS 在 Spark MLlib 中的實現》http://www.csdn.net/article/2015-05-07/2824641
《基于Spark MLlib平臺的協同過濾算法—電影推薦系統》http://snglw.blog.51cto.com/5832405/1662153
《SVD奇異值分解》http://blog.csdn.net/wangran51/article/details/7408414
《基于距離的計算方法》http://blog.sina.com.cn/s/blog_52510b1d01015nrg.html
《相似度算法》http://blog.sina.com.cn/s/blog_62b83291010127bf.html
《movielens數據集下載》http://grouplens.org/datasets/movielens/
《四種網絡模型》http://www.cnblogs.com/forstudy/archive/2012/03/20/2407954.html
《Spark官網ALS實例頁面》http://spark.apache.org/docs/latest/mllib-collaborative-filtering.html
轉載請注明來自36大數據(36dsj.com)http://www.36dsj.com/archives/38018
作者:流川楓AI
鏈接:http://www.lxweimin.com/p/0c2835e3e662
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。