首先,我們先看乙個例子:
協同過濾推薦演算法主要分為基於使用者(user-based)的協同過濾推薦演算法和基於專案(item-based)的協同過濾推薦演算法。
其中基於使用者的協同過濾推薦是
根據鄰居使用者的偏好資訊產生對目標使用者的推薦。通過相似性度量方法計算出相似使用者,並將相似使用者的評分結果作為推薦**結果返回給使用者。由圖可以看出mary對這幾部的電影的評價和tom對這幾部的電影評價很相近,所以我們就認為mary是tom的相似使用者,那麼在**tom對《槍王之王》時會利用mary對這部電影的評價結果。
同樣,基於專案的協同過濾推薦是根據相似專案的評價資訊來**目標專案的評價分數。由圖可以知道所有使用者對《唐山大**》和《阿凡達》的評價分數很相近,那麼就認為《唐山大**》和《阿凡達》是相似專案。那麼在**lucy對《阿凡達》的評價時會利用此專案的相似專案評價結果來進行**。
2、選擇相似度方法。這裡給出了三種相似度計算方法。我們都把相似度歸一化到了0到1之間,歐式距離方法用相似度等於1/(1+距離),皮爾遜相關係數原來的取值範圍為-1到1之間,余弦相似度的取值範圍原來也是在-1到1之間。
def ecludsim(ina,inb): #歐氏距離計算相似度
return 1.0/(1.0 + la.norm(ina - inb))
def pearssim(ina,inb): #皮爾遜相關係數(pearson correlation)計算相似度
if len(ina) < 3 : return 1.0
return 0.5+0.5*corrcoef(ina, inb, rowvar = 0)[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)
3、計算專案相似度並推薦。
主要思路:
*尋找使用者沒有評價的電影,即資料集中0值得位置。
*計算**專案和其他專案之間的相似度並對該專案進行評價。
*將這些專案的評分進行從高到低排序。
'''
功能:估計**
輸入變數:
datamat:原始資料集
user:使用者編號
simmeas:相似度計算方法
item:專案編號
輸出變數:**的評價分
'''def standest(datamat, user, simmeas, item):
n = shape(datamat)[1] #計算有多少個專案
simtotal = 0.0; ratsimtotal = 0.0 #初始化
for j in range(n): #遍歷該使用者所在行的所有專案
userrating = datamat[user,j]
if userrating == 0: continue #如果某個物品評價為0,意味著使用者沒有對該物品評價,跳過
overlap = nonzero(logical_and(datamat[:,item].a>0,datamat[:,j].a>0))[0] #(1)
print 'item,j =',item,j
print 'overlap=',overlap
if len(overlap) == 0: similarity = 0 # 如果兩者沒有任何重合元素,則相似度為0
else: similarity = simmeas(datamat[overlap,item],datamat[overlap,j]) #計算這兩個專案的相似度
print 'the %d and %d similarity is: %f' % (item, j, similarity)
simtotal += similarity #這兩句**的作用是使評價分值在0到5之間
ratsimtotal += similarity * userrating
if simtotal == 0: return 0
else: return ratsimtotal/simtotal
'''功能:推薦(**)未評價的目標專案
輸入變數:
datamat:原始資料集
user:使用者編號
simmeas:選擇余弦相似度公式
estmethod:估計**
'''def recommend(datamat, user, n=3, simmeas=cossim, estmethod=standest):
unrateditems = nonzero(datamat[user,:].a==0)[1]#find unrated items 找到未評價的專案元素
if len(unrateditems) == 0: return 'you rated everything'
itemscores =
for item in unrateditems: #遍歷所有的未評價專案元素
estimatedscore = estmethod(datamat, user, simmeas, item) #估計**該專案元素
return sorted(itemscores, key=lambda jj: jj[1], reverse=true)[:n] #並對**得分進行排序
執行結果:
>>>
[(2, 2.6645016297307467)]
分析:即**第2個使用者對第2個電影評價為2.66分
參考文章:1、
2、推薦方法總結:
協同過濾推薦演算法 推薦演算法 基於協同過濾CF
前邊我們已經介紹了推薦演算法裡的基於內容的推薦演算法cb,今天我們來介紹一下基於協同的推薦演算法collaboration filtering cf 協同過濾是乙個利用群體智慧型的乙個演算法,舉乙個簡單的例子,如果放假了你想去北京玩幾天,但是不知道北京都有哪些好玩的,你會怎麼做?你可能會上網查一下的...
基於物品的協同過濾推薦
思想 利用物品間的相似度,給使用者推薦與使用者過去行為物品相似的物品。資源 使用者物品評分矩陣 填空,即對使用者沒有過評分的物品進行 打分 物品相似度評測 改進的余弦相似度 u 表示使用者集,用r表示n m的評分矩陣,rij代表評分項,表示使用者i對物品j的評分。公式分子可以理解為 兩個物品有共同評...
基於協同過濾演算法的推薦
基於協同過濾演算法的推薦 本實驗選用資料為真實電商脫敏資料,僅用於學習,請勿商用 資料探勘的乙個經典案例就是尿布與啤酒的例子。尿布與啤酒看似毫不相關的兩種產品,但是當超市將兩種產品放到相鄰貨架銷售的時候,會大大提高兩者銷量。很多時候看似不相關的兩種產品,卻會存在這某種神秘的隱含關係,獲取這種關係將會...