2 4 推薦系統演算法 BiasSVD演算法實現

2021-10-08 17:52:55 字數 4221 閱讀 9678

biassvd其實就是前面提到的funk svd矩陣分解基礎上加上了偏置項。

biassvd

利用biassvd**使用者對物品的評分,k表示隱含特徵數量:

演算法實現

'''

biassvd model

'''import math

import random

import pandas as pd

import numpy as np

class

biassvd

(object):

def__init__

(self, alpha, reg_p, reg_q, reg_bu, reg_bi, number_latentfactors=

10, number_epochs=

10, columns=

["uid"

,"iid"

,"rating"])

: self.alpha = alpha # 學習率

self.reg_p = reg_p

self.reg_q = reg_q

self.reg_bu = reg_bu

self.reg_bi = reg_bi

self.number_latentfactors = number_latentfactors # 隱式類別數量

self.number_epochs = number_epochs

self.columns = columns

deffit(self, dataset)

:'''

fit dataset

:param dataset: uid, iid, rating

:return:

'''self.dataset = pd.dataframe(dataset)

self.users_ratings = dataset.groupby(self.columns[0]

).agg(

[list])

[[self.columns[1]

, self.columns[2]

]]self.items_ratings = dataset.groupby(self.columns[1]

).agg(

[list])

[[self.columns[0]

, self.columns[2]

]]self.globalmean = self.dataset[self.columns[2]

].mean(

) self.p, self.q, self.bu, self.bi = self.sgd(

)def

_init_matrix

(self)

:'''

初始化p和q矩陣,同時為設定0,1之間的隨機值作為初始值

:return:

'''# user-lf

p =dict

(zip

( self.users_ratings.index,

np.random.rand(

len(self.users_ratings)

, self.number_latentfactors)

.astype(np.float32)))

# item-lf

q =dict

(zip

( self.items_ratings.index,

np.random.rand(

len(self.items_ratings)

, self.number_latentfactors)

.astype(np.float32)))

return p, q

defsgd(self)

:'''

使用隨機梯度下降,優化結果

:return:

'''p, q = self._init_matrix(

)# 初始化bu、bi的值,全部設為0

bu =

dict

(zip

(self.users_ratings.index, np.zeros(

len(self.users_ratings)))

) bi =

dict

(zip

(self.items_ratings.index, np.zeros(

len(self.items_ratings)))

)for i in

range

(self.number_epochs)

:print

("iter%d"

%i) error_list =

for uid, iid, r_ui in self.dataset.itertuples(index=

false):

v_pu = p[uid]

v_qi = q[iid]

err = np.float32(r_ui - self.globalmean - bu[uid]

- bi[iid]

- np.dot(v_pu, v_qi)

) v_pu += self.alpha *

(err * v_qi - self.reg_p * v_pu)

v_qi += self.alpha *

(err * v_pu - self.reg_q * v_qi)

p[uid]

= v_pu

q[iid]

= v_qi

bu[uid]

+= self.alpha *

(err - self.reg_bu * bu[uid]

) bi[iid]

+= self.alpha *

(err - self.reg_bi * bi[iid])2

)print

(np.sqrt(np.mean(error_list)))

return p, q, bu, bi

defpredict

(self, uid, iid)

:if uid not

in self.users_ratings.index or iid not

in self.items_ratings.index:

return self.globalmean

p_u = self.p[uid]

q_i = self.q[iid]

return self.globalmean + self.bu[uid]

+ self.bi[iid]

+ np.dot(p_u, q_i)

if __name__ ==

'__main__'

: dtype =[(

"userid"

, np.int32),(

"movieid"

, np.int32),(

"rating"

, np.float32)

] dataset = pd.read_csv(

"datasets/ml-latest-small/ratings.csv"

, usecols=

range(3

), dtype=

dict

(dtype)

) bsvd = biassvd(

0.02

,0.01

,0.01

,0.01

,0.01,10

,20) bsvd.fit(dataset)

while

true

: uid =

input

("uid: "

) iid =

input

("iid: "

)print

(bsvd.predict(

int(uid)

,int

(iid)

))

推薦系統演算法

常用的推薦任務分為兩種,一種是評分 而另一種是 top n 推 薦。評分 就是給那些沒有評分的專案進行評分,主要依據目標使用者的歷史評 分行為以及相似度計算來 目標專案的分數。top n 推薦就是根據使用者的偏好給 目標使用者推薦其可能喜歡的 n 件物品。1.協同過濾演算法 協同過濾演算法可分為基於...

推薦演算法 推薦系統的評估

其中 ep 是測試資料集合 rs ua i ualu lu u 待推薦的列表大小 離線測試,使用者 u在測試集中影片數量 未打分的影片數量 iu a 是 影片 a 在使用者推薦列表中的排名ap x i 1x pre dict ioni ch ange inre call i ap 2 p redi ...

推薦系統 推薦系統的常用演算法概述

前一陣子準備畢業 的開題,一直在看推薦系統相關的 對推薦系統有了乙個更加清晰和理性的認識,也對推薦演算法有了深入了解。藉此機會總結分享一下,大家多多拍磚。推薦系統的出現 隨著網際網路的發展,人們正處於乙個資訊 的時代。相比於過去的資訊匱乏,面對現階段海量的資訊資料,對資訊的篩選和過濾成為了衡量乙個系...