不多說,直接上干貨!
常見的推薦算法
1、基於關系規則的推薦
2、基於內容的推薦
3、人口統計式的推薦
4、協調過濾式的推薦 (廣泛采用)
協調過濾的概念
在現今的推薦技術和算法中,最被大家廣泛認可和采用的就是基於協同過濾的推薦方法。
協同過濾是利用集體智慧的一個典型方法。要理解什么是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎么做?大部分的人會問問周圍的朋友,看看最近有什么好看的電影推薦,而我們一般更傾向於從口味比較類似的朋友那里得到推薦。這就是協同過濾的核心思想。
換句話說,就是借鑒和你相關人群的觀點來進行推薦,很好理解。
協調過濾的實現步驟
要實現協同過濾的推薦算法,要進行以下三個步驟:
收集數據 ->>> 找到相似用戶和物品 ->>> 進行推薦
第一步:收集數據
這里的數據指的都是用戶的歷史行為數據,比如用戶的購買歷史,關注,收藏行為,或者發表了某些評論,給某個物品打了多少分等等,這些都可以用來作為數據供推薦算法使用,服務於推薦算法。需要特別指出的在於,不同的數據准確性不同,粒度也不同,在使用時需要考慮到噪音所帶來的影響。
第二步:找到相似用戶和物品
這一步也很簡單,其實就是計算用戶間以及物品間的相似度。以下是幾種計算相似度的方法:

第三步:
在知道了如何計算相似度后,就可以進行推薦了。
在協同過濾中,有兩種主流方法:基於用戶的協同過濾,和基於物品的協同過濾。具體怎么來闡述他們的原理呢,看個圖大家就明白了。
基於用戶的 CF 的基本思想相當簡單,基於用戶對物品的偏好找到相鄰鄰居用戶,然后將鄰居用戶喜歡的推薦給當前用戶。計算上,就是將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,找到 K 鄰居后,根據鄰居的相似度權重以及他們對物品的偏好,預測當前用戶沒有偏好的未涉及物品,計算得到一個排序的物品列表作為推薦。
下圖給出了一個例子,對於用戶 A,根據用戶的歷史偏好,這里只計算得到一個鄰居 - 用戶 C,然后將用戶 C 喜歡的物品 D 推薦給用戶 A。

基於物品的 CF 的原理和基於用戶的 CF 類似(即基於物品的推薦和基於用戶的推薦),只是在計算鄰居時采用物品本身,而不是從用戶的角度,即基於用戶對物品的偏好找到相似的物品,然后根據用戶的歷史偏好,推薦相似的物品給他。從計算的角度看,就是將所有用戶對某個物品的偏好作為一個向量來計算物品之間的相似度,得到物品的相似物品后,根據用戶歷史的偏好預測當前用戶還沒有表示偏好的物品,計算得到一個排序的物品列表作為推薦。下圖給出了一個例子,對於物品 A,根據所有用戶的歷史偏好,喜歡物品 A 的用戶都喜歡物品 C,得出物品 A 和物品 C 比較相似,而用戶 C 喜歡物品 A,那么可以推斷出用戶 C 可能也喜歡物品 C。

總結
以上兩個方法都能很好的給出推薦,並可以達到不錯的效果。
但是他們之間還是有不同之處的,而且適用性也有區別。下面進行一下對比:
計算復雜度
Item CF 和 User CF 是基於協同過濾推薦的兩個最基本的算法,User CF 是很早以前就提出來了,Item CF 是從 Amazon 的論文和專利發表之后(2001 年左右)開始流行,大家都覺得 Item CF 從性能和復雜度上比 User CF 更優,其中的一個主要原因就是對於一個在線網站,用戶的數量往往大大超過物品的數量,同時物品的數據相對穩定,因此計算物品的相似度不但計算量較小,同時也不必頻繁更新。但我們往往忽略了這種情況只適應於提供商品的電子商務網站,對於新聞,博客或者微內容的推薦系統,情況往往是相反的,物品的數量是海量的,同時也是更新頻繁的,所以單從復雜度的角度,這兩個算法在不同的系統中各有優勢,推薦引擎的設計者需要根據自己應用的特點選擇更加合適的算法。
適用場景
在非社交網絡的網站中,內容內在的聯系是很重要的推薦原則,它比基於相似用戶的推薦原則更加有效。比如在購書網站上,當你看一本書的時候,推薦引擎會給你推薦相關的書籍,這個推薦的重要性遠遠超過了網站首頁對該用戶的綜合推薦。可以看到,在這種情況下,Item CF 的推薦成為了引導用戶瀏覽的重要手段。同時 Item CF 便於為推薦做出解釋,在一個非社交網絡的網站中,給某個用戶推薦一本書,同時給出的解釋是某某和你有相似興趣的人也看了這本書,這很難讓用戶信服,因為用戶可能根本不認識那個人;但如果解釋說是因為這本書和你以前看的某本書相似,用戶可能就覺得合理而采納了此推薦。
相反的,在現今很流行的社交網絡站點中,User CF 是一個更不錯的選擇,User CF 加上社會網絡信息,可以增加用戶對推薦解釋的信服程度。
LS的原理
LS是ALS算法的基礎,它是一種數學優化技術,也是一種機器學習常用算法。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。
LS還可以用於曲線擬合。
其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。
ALS的原理
ALS算法是2008年以來,用的比較多的協同過濾算法。它已經集成到Spark的Mllib庫中,使用起來比較方便。
從協同過濾的分類來說,ALS算法屬於User-Item CF,也叫做混合CF。它同時考慮了User(用戶)和Item(商品)兩個方面。
用戶和商品的關系,可以抽象為如下的三元組:<User,Item,Rating>。其中,Rating是用戶對商品的評分,表征用戶對該商品的喜好程度。
假設我們有一批用戶數據,其中包含m個User和n個Item,則我們定義Rating矩陣Rm×n,其中的元素rui表示第u個User對第i個Item的評分。
在實際使用中,由於n和m的數量都十分巨大,因此R矩陣的規模很容易就會突破1億項。這時候,傳統的矩陣分解方法對於這么大的數據量已經是很難處理了。
另一方面,一個用戶也不可能給所有商品評分,因此,R矩陣注定是個稀疏矩陣。矩陣中所缺失的評分,又叫做missing item。

針對這樣的特點,我們可以假設用戶和商品之間存在若干關聯維度(比如用戶年齡、性別、受教育程度和商品的外觀、價格等),我們只需要將R矩陣投射到這些維度上即可。這個投射的數學表示是:

這里的≈表明這個投射只是一個近似的空間變換。
其實,不懂這個空間變換的博友們,這里牽扯到奇異值分解的知識。
一般情況下,k的值遠小於n和m的值,從而達到了數據降維的目的。

幸運的是,我們並不需要顯式的定義這些關聯維度,而只需要假定它們存在即可,因此這里的關聯維度又被稱為Latent factor。k的典型取值一般是20~200。
這種方法被稱為概率矩陣分解算法(probabilistic matrix factorization,PMF)。ALS算法是PMF在數值計算方面的應用。
為了使低秩矩陣X和Y盡可能地逼近R,需要最小化下面的平方誤差損失函數:

考慮到矩陣的穩定性問題,使用Tikhonov regularization,則上式變為:



同時,矩陣X和Y,還可以用於比較不同的User(或Item)之間的相似度,如下圖所示:

ALS算法的缺點在於:
1、它是一個離線算法。
2、無法准確評估新加入的用戶或商品。這個問題也被稱為Cold Start問題。
ALS算法優化過程的推導
公式

的直接優化是很困難的,因為X和Y的二元導數並不容易計算,這時可以使用類似坐標下降法的算法,固定其他維度,而只優化其中一個維度。

因此整個優化迭代的過程為:
1.隨機生成X、Y。(相當於對迭代算法給出一個初始解。)
Repeat until convergence {
2.固定Y,使用公式3更新xu。
3.固定X,使用公式4更新yi。
}
一般使用RMSE(root-mean-square error)評估誤差是否收斂,具體到這里就是:

其中,N為三元組<User,Item,Rating>的個數。當RMSE值變化很小時,就可以認為結果已經收斂。

因為這個迭代過程,交替優化X和Y,因此又被稱作交替最小二乘算法(Alternating Least Squares,ALS)。
隱式反饋
用戶給商品評分是個非常簡單粗暴的用戶行為。在實際的電商網站中,還有大量的用戶行為,同樣能夠間接反映用戶的喜好,比如用戶的購買記錄、搜索關鍵字,甚至是鼠標的移動。我們將這些間接用戶行為稱之為隱式反饋(implicit feedback),以區別於評分這樣的顯式反饋(explicit feedback)。
隱式反饋有以下幾個特點:
1、沒有負面反饋(negative feedback)。用戶一般會直接忽略不喜歡的商品,而不是給予負面評價。
2、隱式反饋包含大量噪聲。比如,電視機在某一時間播放某一節目,然而用戶已經睡着了,或者忘了換台。
3、顯式反饋表現的是用戶的喜好(preference),而隱式反饋表現的是用戶的信任(confidence)。比如用戶最喜歡的一般是電影,但觀看時間最長的卻是連續劇。大米購買的比較頻繁,量也大,但未必是用戶最想吃的食物。
4、隱式反饋非常難以量化。
ALS-WR算法
針對隱式反饋,有ALS-WR算法(ALS with Weighted-λ-Regularization)。
首先將用戶反饋分類:

但是喜好是有程度差異的,因此需要定義程度系數:

這里的rui表示原始量化值,比如觀看電影的時間;
這個公式里的1表示最低信任度,α表示根據用戶行為所增加的信任度。
最終,損失函數變為:


