基於物品協同過濾實現商品推薦系統

2022-03-15 11:52:30 字數 3894 閱讀 9375

1、因為是某一品類的特殊電商平台,賣的商品幾百種,但是使用者幾十萬。這種情況,考慮使用itemcf,至於為什麼不是usercf:物品相似度矩陣為 500*500,使用者相似度矩陣為 500000*500000。但是也有乙個問題,使用物品相似度矩陣會不會使資訊丟失更多。

2、類似電影評分資料集,使用者-電影-評分資料,要把原始資料轉換為使用者-物品-評分格式。

瀏覽:1,收藏:3,購買:5 # 每種行為對應的得分
1、從mysql資料庫讀取資料,並轉換為 使用者-商品-評分 字典

class datapro:

def __init__(self):

self.train = dict()

logs = mysql.fetchall(select_sql)

for temp in logs: # mysql查詢得到的使用者日誌

user = temp['user_id']

item = temp['product_id']

type = temp['type']

#print(user,item)

score = int(type_score_dict[type])

if user not in self.train.keys():

self.train.setdefault(user, {})

if item not in self.train[user].keys():

self.train[user].setdefault(item,0)

if score > self.train[user][item]:

self.train[user][item] = score

2、可以將結果序列化,儲存到本地,在實驗過程就不需要查詢資料庫

# 儲存到本地

output = open('../model/data.pkl', 'wb')

pickle.dump(self.train, output)

output.close()

# 讀取檔案

pkl_file = open('../model/data.pkl', 'rb')

self.data = pickle.load(pkl_file)

3、計算物品-物品相似度矩陣

顯示評分和隱式評分的資料,其相似度矩陣的計算公式有所不同

隱式評分

\[sim(i,j) =\frac}}\tag

\]\(n(i)\)和\(n(j)\)分別表示喜歡物品\(i\)和物品\(j\)的人數。

顯式評分

\[\text(i, j) = \frac} r_ \cdot r_}} r_^2} \cdot\sqrt} r_^2}}\tag

\]其中\(r_\)和\(r_\)分別表示使用者 \(u\) 對物品 \(i\)和 \(j\) 的評分,\(u_\)代表同時喜歡物品 \(i\)和 \(j\) 的使用者集合。

3.1 基於隱式評分

def itemsimilarity(self):

# 乙個字典,記錄 rui*ruj

# 乙個字典 記錄 rui^2

# 建立物品-物品的共現矩陣

item2item = dict() # 物品-物品的共現矩陣。分子

buy = dict() # 物品被多少個不同使用者進行過評分。分母

for user, items in self.data.items():

for i in items.keys():

buy.setdefault(i, 0)

buy[i] += 1

item2item.setdefault(i, {})

for j in items.keys():

if i == j: continue

item2item[i].setdefault(j, 0)

item2item[i][j] += 1

# 計算相似度矩陣

self.similar_matrix = dict()

for i, related_items in item2item.items():

self.similar_matrix.setdefault(i, {})

for j, cij in related_items.items():

self.similar_matrix[i][j] = cij / (math.sqrt(buy[i]) * math.sqrt(buy[j]))

return self.similar_matrix

3.2 基於顯式評分

def itemsimilarity(self):

# 乙個字典,記錄 rui*ruj

# 乙個字典 記錄 rui^2

# 建立物品-物品的共現矩陣

item2item = dict() # 物品-物品的共現矩陣。記錄rui*ruj,分子

buy = dict() # 物品被多少個不同使用者進行過評分。記錄rui*rui分母

for user, items in self.data.items():

for i in items.keys():

buy.setdefault(i, 0)

temp = items[i]*items[i]

buy[i] += temp

item2item.setdefault(i, {})

for j in items.keys():

if i == j: continue

item2item[i].setdefault(j, 0)

item2item[i][j] += items[i]*items[j]

# 計算相似度矩陣

self.similar_matrix = dict()

for i, related_items in item2item.items():

self.similar_matrix.setdefault(i, {})

for j, cij in related_items.items():

self.similar_matrix[i][j] = cij / (math.sqrt(buy[i]) * math.sqrt(buy[j]))

return self.similar_matrix

def get_recommend(self,user_id):

k = 20 # 和某物品相似的k個物品

n = 10 # 推薦最相似的10個物品

rank = {}

watched_items = self.data[user_id]

for item,rating in watched_items.items():

for related_item,w in sorted(self.similar_matrix[item].items(),key=itemgetter(1),reverse=true)[:k]:

rank.setdefault(related_item,0)

rank[related_item] += w*float(rating)

return sorted(rank.items(),key=itemgetter(1),reverse=true)[:n]

1、使用者多次瀏覽同乙個商品,其權重如何在**中體現

2、基於當前資料的itemcf完成之後,之後對每天活躍的使用者進行推薦結果更新。此時,要實現相似度矩陣的增量更新。

對於電影推薦,計算得到推薦的電影即可。

商品推薦,額外的要求是每天推薦結果的新穎性。2020-8-10 和 2020-8-11 兩天在首頁展示的推薦商品,要求不一樣。乙個解決方案:過濾掉昨天的推薦物品。

基於物品的協同過濾推薦

思想 利用物品間的相似度,給使用者推薦與使用者過去行為物品相似的物品。資源 使用者物品評分矩陣 填空,即對使用者沒有過評分的物品進行 打分 物品相似度評測 改進的余弦相似度 u 表示使用者集,用r表示n m的評分矩陣,rij代表評分項,表示使用者i對物品j的評分。公式分子可以理解為 兩個物品有共同評...

推薦系統 基於物品的協同過濾推薦 入門

而基於物品的協同過濾則是找出最相似的物品,再結合使用者的評價來給出推薦結果。基於使用者的協同過濾又稱為記憶體型協同過濾,因為我們需要將所有的評價資料都儲存在記憶體中來進行推薦。基於物品的協同過濾也稱為基於模型的協同過濾,因為我們不需要儲存所有的評價資料,而是通過構建乙個物品相似度模型來做推薦。1.修...

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

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