協同過濾推薦算法
分爲基於用戶的協同過濾推薦UserCF和基於物品的協同過濾推薦ItemCF。介紹見《協同過濾的實現步驟》html
一、指導思想python
這種過濾算法的有效性基礎在於:算法
1、用戶偏好具備類似性,即用戶可分類。這種分類的特徵越明顯,推薦準確率越高函數
2、物品之間具備類似性,即偏好某物品的人,都極可能也同時偏好另外一件類似物品測試
二、算法實現spa
總的來講,要實現協同過濾,須要一下幾個步驟:orm
1.收集用戶偏好htm
2.找到類似的用戶或物品blog
3.計算推薦get
2.一、收集用戶偏好
用戶行爲 |
類型 |
特徵 |
做用 |
評分 |
顯式 |
整數量化值[0,n] |
能夠獲得精確偏好 |
投票 |
顯式 |
布爾量化值0|1 |
能夠獲得精確偏好 |
轉發 |
顯式 |
布爾量化值0|1 |
能夠獲得精確偏好 |
保存書籤 |
顯式 |
布爾量化值0|1 |
能夠獲得精確偏好 |
標記書籤Tag |
顯式 |
一些單詞 |
須要進一步分析獲得偏好 |
評論 |
顯式 |
一些文字 |
須要進一步分析獲得偏好 |
點擊流 |
隱式 |
一組點擊記錄 |
須要進一步分析獲得偏好 |
頁面停留時間 |
隱式 |
一組時間信息 |
噪音偏大,很差利用 |
購買 |
隱式 |
布爾量化值0|1 |
能夠獲得精確偏好 |
2.二、原始偏好數據的預處理
v 用戶行爲識別/組合
在通常應用中,咱們提取的用戶行爲通常都多於一種,關於如何組合這些不一樣的用戶行爲,好比,能夠將用戶行爲分爲「查看」和「購買」等等,而後基於不一樣的行爲,計算不一樣的用戶 / 物品類似度。
相似於噹噹網或者京東給出的「購買了該圖書的人還購買了 ...」,「查看了圖書的人還查看了 ...」
v 喜愛程度加權
根據不一樣行爲反映用戶喜愛的程度將它們進行加權,獲得用戶對於物品的整體喜愛。
通常來講,顯式的用戶反饋比隱式的權值大,但比較稀疏,畢竟進行顯示反饋的用戶是少數;同時相對於「查看」,「購買」行爲反映用戶喜愛的程度更大,但這也因應用而異。
v 數據減噪和歸一化。
① 減噪:用戶行爲數據是用戶在使用應用過程當中產生的,它可能存在大量的噪音和用戶的誤操做,咱們能夠經過經典的數據挖掘算法過濾掉行爲數據中的噪音,這樣可使咱們的分析更加精確。
② 歸一化:如前面講到的,在計算用戶對物品的喜愛程度時,可能須要對不一樣的行爲數據進行加權。但能夠想象,不一樣行爲的數據取值可能相差很大,好比,用戶的查看數據必然比購買數據大的多,如何將各個行爲的數據統一在一個相同的取值範圍中,從而使得加權求和獲得的整體喜愛更加精確,就須要咱們進行歸一化處理。最簡單的歸一化處理,就是將各種數據除以此類中的最大值,以保證歸一化後的數據取值在 [0,1] 範圍中。
v 造成用戶偏好矩陣
通常是二維矩陣,一維是用戶列表,另外一維是物品列表,值是用戶對物品的偏好,通常是 [0,1] 或者 [-1, 1] 的浮點數值。
2.三、找到類似物品或用戶
當已經對用戶行爲進行分析獲得用戶喜愛後,咱們能夠根據用戶喜愛計算類似用戶和物品,而後基於類似用戶或者物品進行推薦,這就是最典型的 CF 的兩個分支:基於用戶的 CF 和基於物品的 CF。這兩種方法都須要計算類似度,下面咱們先看看最基本的幾種計算類似度的方法。
2.四、類似度的計算
類似度的計算,現有的幾種基本方法都是基於向量(Vector)的,其實也就是計算兩個向量的距離,距離越近類似度越大。
在推薦的場景中,在用戶 - 物品偏好的二維矩陣中,咱們能夠將一個用戶對全部物品的偏好做爲一個向量來計算用戶之間的類似度,或者將全部用戶對某個物品的偏好做爲一個向量來計算物品之間的類似度。
CF的經常使用方法有三種,分別是歐式距離法、皮爾遜相關係數法、餘弦類似度法。
爲了測試算法,給出如下簡單的用好偏好數據矩陣:
行表示三名用戶,列表示三個品牌,對品牌的喜好度按照1~5增長。
用戶 |
蘋果 |
小米 |
魅族 |
zhangsan |
5 |
5 |
2 |
Lisi |
3 |
5 |
4 |
wangwu |
1 |
2 |
5 |
就是計算每兩個點的距離,好比Nike和Sony的類似度 。
數值越小,表示類似度越高。
def OsDistance(vector1, vector2): sqDiffVector = vector1-vector2 sqDiffVector=sqDiffVector**2 sqDistances = sqDiffVector.sum() distance = sqDistances**0.5 return distance
|
兩個變量之間的相關係數越高,從一個變量去預測另外一個變量的精確度就越高,這是由於相關係數越高,就意味着這兩個變量的共變部分越多,因此從其中一個變量的變化就可越多地獲知另外一個變量的變化。若是兩個變量之間的相關係數爲1或-1,那麼你徹底可由變量X去獲知變量Y的值。
· 當相關係數爲0時,X和Y兩變量無關係。
· 當X的值增大,Y也增大,正相關關係,相關係數在0.00與1.00之間
· 當X的值減少,Y也減少,正相關關係,相關係數在0.00與1.00之間
· 當X的值增大,Y減少,負相關關係,相關係數在-1.00與0.00之間
當X的值減少,Y增大,負相關關係,相關係數在-1.00與0.00之間
相關係數的絕對值越大,相關性越強,相關係數越接近於1和-1,相關度越強,相關係數越接近於0,相關度越弱。
在python中用函數corrcoef實現
經過測量兩個向量內積空間的夾角的餘弦值來度量它們之間的類似性。0度角的餘弦值是1,而其餘任何角度的餘弦值都不大於1;而且其最小值是-1。從而兩個向量之間的角度的餘弦值肯定兩個向量是否大體指向相同的方向。兩個向量有相同的指向時,餘弦類似度的值爲1;兩個向量夾角爲90°時,餘弦類似度的值爲0;兩個向量指向徹底相
反的方向時,餘弦類似度的值爲-1。在比較過程當中,向量的規模大小不予考慮,僅僅考慮到向量的指向方向。餘弦類似度一般用於兩個向量的夾角小於90°以內,所以餘弦類似度的值爲0到1之間。
def cosSim(inA,inB): num = float(inA.T*inB) denom = la.norm(inA)*la.norm(inB) return 0.5+0.5*(num/denom) |
三、計算推薦
計算推薦的過程其實就是KNN算法的計算過程
算法思路
1. 構建物品的同現矩陣
2. 構建用戶對物品的評分矩陣
3. 經過矩陣計算得出推薦結果
推薦結果=用戶評分矩陣*同現矩陣(推薦結果=行*列)
如:4*2.0+3*0.0+4*0.0+3*4.0+1*4.5+2*0.0+0*5.0=24.0
實質:計算各類物品組合的出現次數