贝叶斯个性化排序(BPR)
生活随笔
收集整理的這篇文章主要介紹了
贝叶斯个性化排序(BPR)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
介紹
顯式反饋:用戶對(duì)物品的評(píng)分,如電影評(píng)分
隱式反饋:用戶對(duì)物品的交互行為,如瀏覽,購(gòu)買等,現(xiàn)實(shí)中絕大部分?jǐn)?shù)據(jù)屬于隱式反饋,可以從日志中獲取。
BPR是基于用戶的隱式反饋,為用戶提供物品的推薦,并且是直接對(duì)排序進(jìn)行優(yōu)化。
BPR(Bayesian Personalized Ranking),中文名稱為貝葉斯個(gè)性化排序,是當(dāng)下推薦系統(tǒng)中常用的一種推薦算法。與其他的基于用戶評(píng)分矩陣的方法不同的是BPR主要采用用戶的隱式反饋(如點(diǎn)擊、收藏、加入購(gòu)物車等),通過(guò)對(duì)問(wèn)題進(jìn)行貝葉斯分析得到的最大后驗(yàn)概率來(lái)對(duì)item進(jìn)行排序,進(jìn)而產(chǎn)生推薦。
定義
傳統(tǒng)解決方式
BPR的解決方式
基于矩陣分解的BPR
參考文獻(xiàn)
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:#用戶數(shù)user_count = 943#項(xiàng)目數(shù)item_count = 1682#k個(gè)主題,k數(shù)latent_factors = 20#步長(zhǎng)αlr = 0.01#參數(shù)λreg = 0.01#訓(xùn)練次數(shù)train_count = 1000#訓(xùn)練集train_data_path = 'train.txt'#測(cè)試集test_data_path = 'test.txt'#U-I的大小size_u_i = user_count * item_count# 隨機(jī)設(shè)定的U,V矩陣(即公式中的Wuk和Hik)矩陣U = np.random.rand(user_count, latent_factors) * 0.01 #大小無(wú)所謂V = np.random.rand(item_count, latent_factors) * 0.01biasV = np.random.rand(item_count) * 0.01#生成一個(gè)用戶數(shù)*項(xiàng)目數(shù)大小的全0矩陣test_data = np.zeros((user_count, item_count))#生成一個(gè)一維的全0矩陣test = np.zeros(size_u_i)#再生成一個(gè)一維的全0矩陣predict_ = np.zeros(size_u_i)#獲取U-I數(shù)據(jù)對(duì)應(yīng)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#獲取測(cè)試集的評(píng)分矩陣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):#隨機(jī)獲取一個(gè)用戶u = random.randint(1, self.user_count)#訓(xùn)練集和測(cè)試集的用于不是全都一樣的,比如train有948,而test最大為943if u not in user_ratings_train.keys():continue# 從用戶的U-I中隨機(jī)選取1個(gè)Itemi = random.sample(user_ratings_train[u], 1)[0]# 隨機(jī)選取一個(gè)用戶u沒(méi)有評(píng)分的項(xiàng)目j = random.randint(1, self.item_count)while j in user_ratings_train[u]:j = random.randint(1, self.item_count)#python中的取值從0開(kāi)始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個(gè)矩陣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])# 更新偏置項(xiàng)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#主函數(shù)def main(self):#獲取U-I的{1:{2,5,1,2}....}數(shù)據(jù)user_ratings_train = self.load_data(self.train_data_path)#獲取測(cè)試集的評(píng)分矩陣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#訓(xùn)練for i in range(self.train_count):self.train(user_ratings_train)#訓(xùn)練1000次完成predict_matrix = self.predict(self.U, self.V) #將訓(xùn)練完成的矩陣內(nèi)積# 預(yù)測(cè)self.predict_ = predict_matrix.getA().reshape(-1) #.getA()將自身矩陣變量轉(zhuǎn)化為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__':#調(diào)用類的主函數(shù)bpr = BPR()bpr.main()數(shù)據(jù)集下載
總結(jié)
以上是生活随笔為你收集整理的贝叶斯个性化排序(BPR)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于苹果手机点击事件无效的解决办法
- 下一篇: 国内外设计及素材站[转载]