1. 程式人生 > >推薦系統學習--基於item的協同過濾演算法及python實現

推薦系統學習--基於item的協同過濾演算法及python實現

轉載地址:http://blog.csdn.net/gamer_gyt/article/details/51346159

1:協同過濾演算法簡介

2:協同過濾演算法的核心

3:協同過濾演算法的應用方式

4:基於使用者的協同過濾演算法實現

5:基於物品的協同過濾演算法實現

一:協同過濾演算法簡介

    關於協同過濾的一個最經典的例子就是看電影,有時候不知道哪一部電影是我們喜歡的或者評分比較高的,那麼通常的做法就是問問周圍的朋友,看看最近有什麼好的電影推薦。在問的時候,都習慣於問跟自己口味差不 多的朋友,這就是協同過濾的核心思想。

   協同過濾是在海量資料中挖掘出小部分與你品味類似的使用者,在協同過濾中,這些使用者成為鄰居,然後根據他們喜歡的東西組織成一個排序的目錄推薦給你。所以就有如下兩個核心問題

   (1)如何確定一個使用者是否與你有相似的品味?

   (2)如何將鄰居們的喜好組織成一個排序目錄?

   協同過濾演算法的出現標誌著推薦系統的產生,協同過濾演算法包括基於使用者和基於物品的協同過濾演算法。

二:協同過濾演算法的核心

      要實現協同過濾,需要進行如下幾個步驟 

      1)收集使用者偏好

      2)找到相似的使用者或者物品

      3)計算並推薦

三:協同過濾演算法的應用方式

1:基於使用者的協同過濾演算法

基於使用者的協同過濾通過不同使用者對物品的評分來評測使用者之間的相似性,基於使用者的相似性做推薦,簡單的講:給使用者推薦和他興趣相投的其他使用者喜歡的物品

演算法實現流程分析:

(1):計算使用者的相似度

計算使用者相似度的方法請參考這篇部落格:點選閱讀  這裡我採用的是餘弦相似度

下面我拿這個圖舉例

     

計算使用者的相似度,例如A,B為

同理

         但是這樣計算的效率是低的,因為我們需要計算每一對使用者之間的相似度,事實上,很多使用者相互之間並沒有對同樣的物品產生過行為,所以很多時候當分子為0的時候沒有必要再去計算分母,所以這裡可以優化:即首先計算出|N(u) 並 N(v)| != 0 的使用者對(u,v),然後對這種情況計算分母以得到兩個使用者的相似度。

針對此優化,需要2步:

     (1)建立物品到使用者的倒查表T,表示該物品被哪些使用者產生過行為;

     (2)根據倒查表T,建立使用者相似度矩陣W:在T中,對於每一個物品i,設其對應的使用者為j,k,在W中,更新相應的元素值,w[j][k]=w[j][k]+1,w[k][j]=w[k][j]+1,以此類推,掃描完倒查表T中的所有物品後,就可以得到最終的使用者相似度矩陣W,這裡的W是餘弦相似度中的分子部分,然後將W除以分母可以得到最終的使用者興趣相似度。

得到使用者的相似度後,便可以進行下一步了

(2):給使用者推薦興趣最相近的k個使用者所喜歡的物品

公式如下:

其中,p(u,i)表示使用者u對物品i的感興趣程度,S(u,k)表示和使用者u興趣最接近的K個使用者,N(i)表示對物品i有過行為的使用者集合,Wuv表示使用者u和使用者v的興趣相似度,Rvi表示使用者v對物品i的興趣(這裡簡化,所有的Rvi都等於1)。

根據UserCF演算法,可以算出,使用者A對物品c、e的興趣是:

2:基於物品的協同過濾演算法

基於item的協同過濾通過不同使用者對不同item的評分來評測item之間的相似性,基於item的相似性做推薦,簡單的講:給使用者推薦和他之前喜歡物品相似的物品

演算法流程分析:

同樣拿上邊的圖舉例,在這裡預設使用者對物品的打分均為1

(1):構建物品的同現矩陣


在這裡對矩陣做歸一化處理就可以得到物品之間的餘弦相似度矩陣了其中歸一化處理

按照標準定義

這裡,分母|N(i)|是喜歡物品i的使用者數,而分子 N(i) N( j) 是同時喜歡物品i和物品j的使用者數。因此,上述公式可以理解為喜歡物品i的使用者中有多少比例的使用者也喜歡物品j。

進行處理後的結果為:


當然為了出現推薦熱門的商品,對上述公式的優化為:

這個公式懲罰了物品j的權重,因此減輕了熱門物品會和很多物品相似的可能性(此種情況下感興趣的自己推導)。

(2):建立使用者對物品的評分矩陣(以A舉例,沒有評分的物品為0)

(3):矩陣計算推薦結果


這裡N(u)是使用者喜歡的物品的集合,S(j,K)是和物品j最相似的K個物品的集合,wji是物品j和i的相似度,rui是使用者u對物品i的興趣。(對於隱反饋資料集,如果使用者u對物品i有過行為,即可令rui=1。)該公式的含義是,和使用者歷史上感興趣的物品越相似的物品,越有可能在使用者的推薦列表中獲得比較高的排名。

推薦結果=同現矩陣 * 評分矩陣


從中去掉A已經打過分的物品,a,b,d,則可以看出,A對e的喜歡程度和c一樣,和上邊計算結果一致,所以就會將兩者推薦給A

3:混合推薦

所謂的混合演算法,主體思路還是基於使用者的協同過濾,只是在計算兩個使用者的相似度時又嵌套了item-based CF思想。

度量使用者i和使用者j相似度更好的方法是:

1.使用者i參與評分的專案集合為IiIi,使用者j參與評分的專案集合為IjIj,找到它們的並集Uij=IiIjUij=Ii∪Ij

2.在集合UijUij中使用者i未評分的專案是Ni=UijIiNi=Uij−Ii,採用item-based CF方法重新估計使用者i對NiNi中每個專案的評分。

3.這樣使用者i和j對UijUij的評分就都是非0值了,在此情況下計算他們的相似度。

四:基於使用者的協同過濾演算法實現

  1. #-*-coding:utf-8-*-
  2. ''''' 
  3. Created on 2016年5月2日 
  4. @author: Gamer Think 
  5. '''
  6. from math import sqrt  
  7. fp = open("uid_score_bid","r")  
  8. users = {}  
  9. for line in open("uid_score_bid"):  
  10.     lines = line.strip().split(",")  
  11.     if lines[0notin users:  
  12.         users[lines[0]] = {}  
  13.     users[lines[0]][lines[2]]=float(lines[1])  
  14. #----------------新增程式碼段END----------------------
  15. class recommender:  
  16.     #data:資料集,這裡指users
  17.     #k:表示得出最相近的k的近鄰
  18.     #metric:表示使用計算相似度的方法
  19.     #n:表示推薦book的個數
  20.     def __init__(self, data, k=3, metric='pearson', n=12):  
  21.         self.k = k  
  22.         self.n = n  
  23.         self.username2id = {}  
  24.         self.userid2name = {}  
  25.         self.productid2name = {}  
  26.         self.metric = metric  
  27.         ifself.metric == 'pearson':  
  28.             self.fn = self.pearson  
  29.         if type(data).__name__ == 'dict':  
  30.             self.data = data  
  31.     

    相關推薦

    推薦系統學習--基於item協同過濾演算法python實現

    轉載地址:http://blog.csdn.net/gamer_gyt/article/details/51346159 1:協同過濾演算法簡介 2:協同過濾演算法的核心 3:協同過濾演算法的應用方式 4:基於使用者的協同過濾演算法實現

    基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一) 協同過濾演算法概述&&基於模型的協同過濾演算法思想(演算法模型和結構待補充)

    本文暫時分為三部分: (一)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一)            → 協同過濾演算法概述&&基於模型的協同過濾的演算法思想 (二)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦

    推薦系統實踐》——基於物品的協同過濾演算法(程式碼實現

    一、基礎演算法 基於物品的協同過濾演算法(簡稱ItemCF)給使用者推薦那些和他們之前喜歡的物品相似的物品。不過ItemCF不是利用物品的內容計算物品之間相似度,而是利用使用者的行為記錄。 該演算法認為,物品A和物品B具有很大的相似度是因為喜歡物品A的使用者

    推薦系統實踐----基於使用者的協同過濾演算法python程式碼實現書中案例)

    本文參考項亮的《推薦系統實踐》中基於使用者的協同過濾演算法內容。因其中程式碼實現部分只有片段,又因本人初學,對python還不是很精通,難免頭大。故自己實現了其中的程式碼,將整個過程走了一遍。 1. 過程簡述 a. 首先我們因該先找到和目標使用者興趣相似的使用者集合。簡單來

    基於使用者最近鄰模型的協同過濾演算法Python程式碼實現

    #------------------------------------------------------------------------------- # Name: PearsonUserNeighCF # Purpose: Personalized Recommendati

    Slope one—個性化推薦中最簡潔的協同過濾演算法

    Slope One 是一系列應用於 協同過濾的演算法的統稱。由 Daniel Lemire和Anna Maclachlan於2005年發表的論文中提出。 [1]有爭議的是,該演算法堪稱基於專案評價的non-trivial 協同過濾演算法最簡潔的形式。該系列演算法的簡潔特

    推薦系統學習——基於概率分析的方法

    用途:預測使用者對物品評分 輸入:所有使用者對所有物品的評分矩陣 輸出:使用者A對物品I的評分 預測使用者A對物品I的所有可能評分的概率,然後選出概率最大的評分作為輸出   物品1 物品2 物品3 物品4

    基於圖的推薦演算法Python實現(PersonalRank)

    使用隨機遊走演算法PersonalRank實現基於圖的推薦。 二部圖 在推薦系統中,使用者行為資料可以表示成圖的形式,具體來說是二部圖。使用者的行為資料集由一個個(u,i)二元組組成,表示為使用者u對物品i產生過行為。本文中我們認為使用者對他產生過行為的物品的興

    基於圖的推薦演算法python實現

    概述 基於圖的模型(graph-based model)是推薦系統中的重要內容。 在推薦系統中,使用者行為資料可以表示成圖的形式,具體地,可以用二元組(u,i)(u,i)表示,其中每個二元組(u,i)(u,i)表示使用者uu對物品ii的產生過行為,這種資料

    梯度下降演算法python實現學習筆記)

    梯度下降(Gradient Descent)演算法是機器學習中使用非常廣泛的優化演算法。當前流行的機器學習庫或者深度學習庫都會包括梯度下降演算法的不同變種實現。 本文主要以線性迴歸演算法損失函式求極小值來說明如何使用梯度下降演算法並給出python實現。若有不正確的地方,希

    機器學習-簡單的K最近鄰演算法python實現

    根據前人的成果進行了學習 https://www.cnblogs.com/ahu-lichang/p/7161613.html#commentform 1、演算法介紹 其實k最近鄰演算法算是聚類演算法中最淺顯易懂的一種了,考慮你有一堆二維資料,你想很簡單的把它分開,像下圖這

    機器學習——感知器演算法python實現

    說明:本文從自己的理解出發來講解感知器是如何訓練的,如想知道比較學術的概念,請查閱相關論文。 1、什麼是感知器 本文假設資料為:二維二類、線性可分 感知器就是一個分類器,如:給兩類資料做訓練集A,B,訓練完成之後,給定一個測試資料,通過感知器,可以分成A或B。 因為資料是二

    機器學習經典算法具體解釋Python實現--線性回歸(Linear Regression)算法

    ica single 方便 最好的 而且 == show des fun (一)認識回歸 回歸是統計學中最有力的工具之中的一個。機器學習監督學習算法分為分類算法和回歸算法兩種,事實上就是依據類別標簽分布類型為離散型、連續性而定義的。顧名思義。分類算法用於離散型分布

    KNN演算法python實現

    KNN演算法原理和python實現 K最近鄰(kNN,k-NearestNeighbor)分類演算法是資料探勘分類技術中最簡單的方法之一。 原理是:如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的

    k-means演算法python實現

    本篇文章主要講解聚類分析中的一種常用的演算法k-means,它的全稱叫作k均值演算法。 k-means原理 k-means演算法是一種基於原型的、劃分的聚類技術。 基於原型可以理解為基於質心,也就是說,每個物件到定義該簇質心的距離比到其他簇質心的距離更近。當質心沒有意義

    凸包問題的Graham-Scan演算法python實現

    基於 Graham-Scan 的凸包求解演算法是在列舉三角形時,採用了更精細的方式,將P_0作為極點,通過極角大小定位最右下側的三角形∆P_0 P_1 P_2,然後讓三角形繞P_0點旋轉,掃描所有輸入點,直到到最左下側為止。 首先要對點集S進行預處理,

    關聯規則,Apriori演算法python實現

    1 關聯規則 關聯分析一個典型的例子是購物籃分析,廣泛應用於零售業,通過檢視那些商品經常在一起購買,可以幫助商店瞭解使用者的購買行為。一個最有名的例子是“尿布與啤酒”,據報道,美國中西部的一家連鎖店發現,男人們會在週四購買尿布和啤酒,這樣商家實際上就可以將尿布

    最大公約數歐幾里德演算法Python實現

    歐幾里德演算法又稱輾轉相除法,用於計算兩個整數m, n的最大公約數。其計算原理依賴於下面的定理:    gcd(m, n) = gcd(n, m mod n)這個定理的意思是:整數m、n的最大公約數等於n和m除以n的餘數的最大公約數。 例如:有兩個整數:120和45,我們按照

    凸包問題的分治演算法python實現

    利用分治思想處理凸包問題。 劃分:將點集S中的資料按橫座標排序,選出橫座標最小的點A和縱座標最小的點B,AB的連線將S劃分為兩個子集,位於(AB) 上方的集合S1和位於(BA) 上方的集合S2。 遞迴求解:遞迴呼叫演算法求S1的凸包和S2的凸包,遞迴演算

    吳恩達機器學習(十四)推薦系統基於梯度下降的協同過濾演算法

    目錄 0. 前言 學習完吳恩達老師機器學習課程的推薦系統,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅供參考。 如果這篇文章對你有一點小小的幫助,請給個關注喔~我會非常開心的~ 0. 前言 在推薦系統中,主要有兩種方法,基於內容的推薦