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