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

2022-07-19 21:15:25 字數 4295 閱讀 8501

輸入

輸入:物品使用者行為矩陣,行為矩陣中的元素只有0和1,0代表行為的負類,1代表行為的正類。比如不喜歡與喜歡、不點贊與點讚、不收藏與收藏。

輸出

輸出1:根據輸入可計算得到物品相似度矩陣;

前言

基於物品的協同過濾演算法適用於物品數明顯小於使用者數的場景,適用於長尾物品豐富,使用者個性化需求強烈的領域。但是該演算法不適用於物品變化較快的場景,比如新聞類的應用,如果物品一直在變化,那麼會增加物品相似度更新的頻率,不夠穩定,此類場景下可以考慮選擇基於使用者的協同過濾演算法。

原理

基於物品的協同過濾誕生於2023年,是由亞馬遜首先提出,適用於使用者明顯多於物品的情況。基於物品的協同過濾演算法的原始想法是:給使用者推薦使用者喜歡的物品相似的物品。問題在於「相似的物品」是如何度量的,基於內容的推薦系統中,物品相似是用內容的相似性計算出來的,但是實際上人的群體行為還是會有一些內容特徵抓不到的相似性。

使用者的數量往往很多,使用者之間相似度計算起來工作量大;

使用者的興趣愛好變化較快,所以這個動態變化的過程很難被跟蹤和記錄。

基於物品的協同過濾可以較好的解決上面的問題。物品的數量遠遠少於使用者的數量,而且物品之間的相似度不易改變,物品對應的消費者數量大,所以計算出來的物品相似度比較可靠。 

協同過濾演算法依賴於使用者物品之間的關係矩陣(如表1所示)。基於物品的協同過濾演算法除了依賴使用者物品之間的關係矩陣,還依賴於物品之間的相似度矩陣(如表2所示)。

計算物品的相似度有好幾種方法,比如余弦相似度、傑卡德(jaccard)相似度,余弦相似度適用於評分資料,傑卡德(jaccard)相似度適用於隱式反饋資料,由於這裡使用的使用者戶物品矩陣是隱式反饋資料,所以介紹下jaccard相似度的計算公式:

式子表示的是物品m與n的相似度,其中

表示喜歡物品m的使用者的集合,

表示喜歡物品n的使用者的集合,分子為同時喜歡物品m,n的使用者集合,分母為喜歡物品m,n的使用者集合的並集。

計算使用者u對物品i的評分,需要遍歷使用者喜歡過的物品集合a,對於集合a中的任意物品j,求使用者u對j評分

與物品i、j的相似度sim(i,j)之積,然後累加得到使用者u對物品i的評分。

可以依次求得使用者u對所有物品的評分,去掉使用者已經喜歡過的物品後,保留分數最高的n個結果推薦給使用者u。

python**實現

1

#1、手動構造乙個使用者物品行為矩陣,行為物品,列為使用者,矩陣元素值為(0,1),0代表不感興趣,1代表感興趣2#

2、根據使用者行為矩陣,計算出物品相似度矩陣3#

3、根據物品相似度矩陣以及使用者喜歡的物品推薦出topn個物品

4import

numpy as np5#

100*200的物品使用者行為矩陣

6 item_user_matrix = np.random.randint(0,2,size=(100, 200),dtype=np.int)78

#計算物品的相似度矩陣sim,形狀為100*1009#

對於隱式反饋資料,使用傑卡德(jaccard)相似係數計算物品的相似度,sim(i,j)表示物品i與物品j的相似度,10#

等於同時喜歡物品i和j的使用者數除以喜歡物品i和物品j的使用者總數

11 rownum =item_user_matrix.shape[0]

12 columnum =item_user_matrix.shape[0]

13 sim_matrix = np.zeros((rownum, columnum)).astype('

float')

14#同時喜歡下標為colum的物品和下標為row的物品的使用者數

15 columandrow_num =016#

喜歡下標為colum的物品的使用者數與喜歡下標為row的物品的使用者數之和

17 columorrow_num =0

18for row in

range(0, rownum):

19for colum in

range(0, columnum):

20if colum < row: #

只需要對矩陣下三角更新21#

因為矩陣元素只有0和1,求點積即為交集

22 columandrow_num =np.dot(item_user_matrix[colum], item_user_matrix[row])23#

元素相加求和,就求得並集

24 columorrow_num = item_user_matrix[colum].sum() +item_user_matrix[row].sum()

25 sim_matrix[row][colum] = columandrow_num/columorrow_num

26print('

columandrow_num:{}, columorrow_num:{}, sim_matrix[{}][{}]:{}'.

27format(columandrow_num,columorrow_num, row, colum, sim_matrix[row][colum]))

2829

#根據物品相似度矩陣以及使用者喜歡的物品推薦出topn個物品30#

欲求使用者user對物品i的喜歡度,首先求出使用者user喜歡的物品集合,根據物品相似度矩陣,求出物品i與使用者user喜歡的物品對應的相似度31#

相似度與喜歡度相乘求和,除以相似度之和,得到的商為使用者user對物品i的相似度32#

求得喜歡度之後,選擇topn個做推薦

33def

topnrecom(user, n):34#

字典的鍵為物品下標編號,值為喜歡度

35 result ={}36#

user對應的物品向量

37 itemvec =item_user_matrix[:,user]

38for item in

range(0,rownum):39#

直接做點積即可,因為使用者還沒有發生行為的物品喜歡度為0,與相似度相乘還是0,無影響

40 user_item_sim_sum =np.dot(itemvec, sim_matrix[item])

41 result[item] =user_item_sim_sum;42#

從result中去掉使用者已經發生過行為的物品,然後再推薦出**喜歡度較高的top n個物品

43for index in

range(0, len(itemvec)):

44if(1 ==itemvec[index]):

45result.pop(index)

46return sorted(result.items() , key=lambda x: x[1], reverse=true)[:n]

4748 user = 122

49 n = 10

50 itemlist =topnrecom(user, n)

51print('

user[{}] top [{}] recom result:{}

'.format(user, n, itemlist))

**執行結果本文**手動構造了乙個100*200的物品使用者行為矩陣,實際工業環境中肯定不止這點資料量,本中重點在於講解原理和一種實現方法,對於某個使用者而言,推薦喜歡度最高的10個物品,**執行結果如下:

1 user[122] top [10] recom result:[(98, 13.734837466951667), (97, 13.534563830373337), (90, 12.351537112348055), (94, 12.194631579469013), (82, 11.25929195188074), (84, 10.662303442296619), (80, 10.60327372276929), (79, 10.570187047487309), (77, 9.94780886977415), (69, 8.431845325504977)]
按照喜歡度從高到底排序,推薦的物品id為98、97、90、94、82、84、80、79、77、69。

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

核心思想 給使用者推薦那些和他們之前喜歡的物品相似的物品。不同於基於內容的推薦,基於物品的協同過濾中的相似主要是利用使用者行為的集體智慧型。相似度的計算計算相似度的實現方式是多種多樣的 對物品的喜愛程度並不能單純的使用二值屬性來評價,很多資料集包含了使用者對物品的詳細評分資料,將評分資料進一步引入到...

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

余弦相似度公式 其中 共現矩陣,記錄了同時愛好 i 和 j 的數量 根據余弦相似度公式計算相似度 初始化使用者評分資料 def inituserscore self user score dict b c d return user score dict 計算item之間的相似度 def items...

推薦演算法 基於物品的協同過濾演算法

itemcf itemcollaborationfilter,基於物品的協同過濾 比如,使用者a之前買過 資料探勘導論 該演算法會根據此行為給你推薦 機器學習 但是itemcf演算法並不利用物品的內容屬性計算物品之間的相似度,它主要通過分析使用者的行為記錄計算物品之間的相似度。該演算法認為,物品a和...