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