日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贝叶斯个性化排序(BPR)

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贝叶斯个性化排序(BPR) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

顯式反饋:用戶對物品的評分,如電影評分
隱式反饋:用戶對物品的交互行為,如瀏覽,購買等,現實中絕大部分數據屬于隱式反饋,可以從日志中獲取。
BPR是基于用戶的隱式反饋,為用戶提供物品的推薦,并且是直接對排序進行優化。

BPR(Bayesian Personalized Ranking),中文名稱為貝葉斯個性化排序,是當下推薦系統中常用的一種推薦算法。與其他的基于用戶評分矩陣的方法不同的是BPR主要采用用戶的隱式反饋(如點擊、收藏、加入購物車等),通過對問題進行貝葉斯分析得到的最大后驗概率來對item進行排序,進而產生推薦。

定義

傳統解決方式

BPR的解決方式


基于矩陣分解的BPR

參考文獻

https://www.cnblogs.com/pinard/p/9128682.html#commentform

代碼部分

import random from collections import defaultdict import numpy as np from sklearn.metrics import roc_auc_score import scoresclass BPR:#用戶數user_count = 943#項目數item_count = 1682#k個主題,k數latent_factors = 20#步長αlr = 0.01#參數λreg = 0.01#訓練次數train_count = 1000#訓練集train_data_path = 'train.txt'#測試集test_data_path = 'test.txt'#U-I的大小size_u_i = user_count * item_count# 隨機設定的U,V矩陣(即公式中的Wuk和Hik)矩陣U = np.random.rand(user_count, latent_factors) * 0.01 #大小無所謂V = np.random.rand(item_count, latent_factors) * 0.01biasV = np.random.rand(item_count) * 0.01#生成一個用戶數*項目數大小的全0矩陣test_data = np.zeros((user_count, item_count))#生成一個一維的全0矩陣test = np.zeros(size_u_i)#再生成一個一維的全0矩陣predict_ = np.zeros(size_u_i)#獲取U-I數據對應def load_data(self, path):user_ratings = defaultdict(set)with open(path, 'r') as f:for line in f.readlines():u, i = line.split(" ")u = int(u)i = int(i)user_ratings[u].add(i)return user_ratings#獲取測試集的評分矩陣def load_test_data(self, path):file = open(path, 'r')for line in file:line = line.split(' ')user = int(line[0])item = int(line[1])self.test_data[user - 1][item - 1] = 1def train(self, user_ratings_train):for user in range(self.user_count):#隨機獲取一個用戶u = random.randint(1, self.user_count)#訓練集和測試集的用于不是全都一樣的,比如train有948,而test最大為943if u not in user_ratings_train.keys():continue# 從用戶的U-I中隨機選取1個Itemi = random.sample(user_ratings_train[u], 1)[0]# 隨機選取一個用戶u沒有評分的項目j = random.randint(1, self.item_count)while j in user_ratings_train[u]:j = random.randint(1, self.item_count)#python中的取值從0開始u = u - 1i = i - 1j = j - 1#BPRr_ui = np.dot(self.U[u], self.V[i].T) + self.biasV[i]r_uj = np.dot(self.U[u], self.V[j].T) + self.biasV[j]r_uij = r_ui - r_ujloss_func = -1.0 / (1 + np.exp(r_uij))# 更新2個矩陣self.U[u] += -self.lr * (loss_func * (self.V[i] - self.V[j]) + self.reg * self.U[u])self.V[i] += -self.lr * (loss_func * self.U[u] + self.reg * self.V[i])self.V[j] += -self.lr * (loss_func * (-self.U[u]) + self.reg * self.V[j])# 更新偏置項self.biasV[i] += -self.lr * (loss_func + self.reg * self.biasV[i])self.biasV[j] += -self.lr * (-loss_func + self.reg * self.biasV[j])def predict(self, user, item):predict = np.mat(user) * np.mat(item.T)return predict#主函數def main(self):#獲取U-I的{1:{2,5,1,2}....}數據user_ratings_train = self.load_data(self.train_data_path)#獲取測試集的評分矩陣self.load_test_data(self.test_data_path)#將test_data矩陣拍平for u in range(self.user_count):for item in range(self.item_count):if int(self.test_data[u][item]) == 1:self.test[u * self.item_count + item] = 1else:self.test[u * self.item_count + item] = 0#訓練for i in range(self.train_count):self.train(user_ratings_train)#訓練1000次完成predict_matrix = self.predict(self.U, self.V) #將訓練完成的矩陣內積# 預測self.predict_ = predict_matrix.getA().reshape(-1) #.getA()將自身矩陣變量轉化為ndarray類型的變量self.predict_ = pre_handel(user_ratings_train, self.predict_, self.item_count)auc_score = roc_auc_score(self.test, self.predict_)print('AUC:', auc_score)# Top-K evaluationscores.topK_scores(self.test, self.predict_, 5, self.user_count, self.item_count)def pre_handel(set, predict, item_count):# Ensure the recommendation cannot be positive items in the training set.for u in set.keys():for j in set[u]:predict[(u - 1) * item_count + j - 1] = 0return predictif __name__ == '__main__':#調用類的主函數bpr = BPR()bpr.main()

數據集下載

總結

以上是生活随笔為你收集整理的贝叶斯个性化排序(BPR)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。