秦育華
摘要:推薦系統(tǒng)可以有效地幫助用戶從海量信息中獲得自己的潛在需求,為用戶實(shí)現(xiàn)個(gè)性化推薦。本文研究了協(xié)同過(guò)濾算法,使用Python語(yǔ)言實(shí)現(xiàn)了基于用戶的協(xié)同過(guò)濾推薦系統(tǒng),構(gòu)建了推薦系統(tǒng)的架構(gòu),給出了實(shí)現(xiàn)個(gè)性化推薦的關(guān)鍵代碼,并在ml-latest-small 數(shù)據(jù)集上對(duì)用戶相似度算法進(jìn)行了測(cè)試。
關(guān)鍵詞:相似性;協(xié)同過(guò)濾;推薦系統(tǒng);Python
中圖分類號(hào):TP311 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)31-0234-03
1 概述
信息技術(shù)和互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展以及數(shù)據(jù)量爆炸式的增長(zhǎng),將我們帶到了“信息過(guò)載”[1]的時(shí)代,使我們難以從海量的數(shù)據(jù)中獲得真正需要的信息。如何從海量信息中找到用戶真正感興趣的信息成為新的難題。傳統(tǒng)搜索引擎主要依賴于用戶對(duì)需求的準(zhǔn)確描述,向所有用戶提供相同的推薦結(jié)果,不是個(gè)性化服務(wù)。推薦系統(tǒng)不需要用戶提供明確的需求,它通過(guò)分析用戶的歷史行為,挖掘用戶興趣并建模,主動(dòng)為用戶推薦能夠滿足他們興趣和需要的信息[2],能夠有效地為用戶提供個(gè)性化服務(wù)。
2 推薦系統(tǒng)與相關(guān)技術(shù)
2.1推薦系統(tǒng)和協(xié)同過(guò)濾算法
推薦系統(tǒng)能夠在信息過(guò)載的環(huán)境中,為用戶精確的推薦令他們感興趣的信息。它不僅能夠滿足用戶的個(gè)性化需求,而且能夠增強(qiáng)用戶關(guān)聯(lián)性[3],跟蹤用戶偏好,提高銷售能力。推薦系統(tǒng)通常分為三類:基于內(nèi)容的過(guò)濾、協(xié)同過(guò)濾和混合推薦。其中,協(xié)同過(guò)濾獨(dú)立于資源,且不考慮物品內(nèi)容信息,易于實(shí)現(xiàn),是目前最成功且應(yīng)用最廣的一種推薦算法。
協(xié)同過(guò)濾算法(Collaborative Filtering,CF)是根據(jù)用戶的歷史行為信息,計(jì)算用戶之間的相似度,并推薦用戶喜歡的物品。協(xié)同過(guò)濾算法是根據(jù)用戶的相似度,而不是物品的客觀屬性提供個(gè)性化的推薦,因此它可以過(guò)濾任何類型的物品,如電影、音樂、文本等。根據(jù)推薦對(duì)象的不同,協(xié)同過(guò)濾算法分為基于物品的協(xié)同過(guò)濾算法和基于用戶的協(xié)同過(guò)濾算法。
2.2基于物品的協(xié)同過(guò)濾算法
基于物品的協(xié)同過(guò)濾算法(Item-based collaborative filtering ,Item-base CF)主要考慮用戶的個(gè)性化特征,通過(guò)分析用戶的行為數(shù)據(jù),計(jì)算與用戶喜歡的物品之間的相似度,為用戶推薦與其之前感興趣物品相似的新物品。該算法主要包括兩個(gè)步驟:(1)根據(jù)用戶的評(píng)分?jǐn)?shù)據(jù),計(jì)算任意兩個(gè)物品之間的相似度;(2)根據(jù)物品間的相似度和用戶的歷史行為,為用戶生成推薦物品列表。
2.3 基于用戶的協(xié)同過(guò)濾算法
基于用戶的協(xié)同過(guò)濾算法(User-based collaborative filtering, User-base CF)由Goldberg等人于1992年提出并用于郵件過(guò)濾系統(tǒng)[4]。該算法主要考慮用戶的社會(huì)屬性,通過(guò)分析用戶的行為數(shù)據(jù),計(jì)算用戶之間的興趣相似度,為目標(biāo)用戶推薦相似用戶感興趣的物品。該算法主要包括兩個(gè)步驟:(1)找到與目標(biāo)用戶興趣相似的用戶集合;(2)在這個(gè)用戶集合中,找到用戶感興趣的,且目標(biāo)用戶不知道的物品并推薦給目標(biāo)用戶。
3 基于用戶的協(xié)同過(guò)濾推薦系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
3.1 用戶相似度算法
相似度的度量在協(xié)同過(guò)濾中起著基礎(chǔ)性的作用,如何計(jì)算用戶之間的相似度,是協(xié)同過(guò)濾中最關(guān)鍵的問(wèn)題。常見的計(jì)算用戶相似度的算法有余弦相似度和歐氏距離等。
1)余弦相似度(Cosine Similarity)
在協(xié)同過(guò)濾的計(jì)算中,余弦相似度將用戶評(píng)分看作是n維空間上的向量,通過(guò)計(jì)算兩個(gè)向量之間夾角的余弦值,度量?jī)蓚€(gè)用戶間的相似性,其值域?yàn)閇-1, 1]:1代表夾角為0°, 表示完全相似;-1代表夾角為180°, 表示完全不相似。計(jì)算用戶U和用戶V的相似度公式如下:
[wuv=|N(u)∩N(v)||N(u)∥N(v)|]
其中,N(u)和N(V)表示用戶U和用戶V感興趣的物品評(píng)分。余弦相似度注重兩個(gè)向量在方向上的差異,而不是距離或長(zhǎng)度上的差異,能夠較好地反映用戶間共同的興趣。
2)歐氏距離(Euclidean Distance)
歐氏距離衡量的是空間中兩點(diǎn)之間的絕對(duì)距離,在協(xié)同過(guò)濾的計(jì)算中,歐氏距離是根據(jù)兩個(gè)用戶共同評(píng)過(guò)分的項(xiàng)目集,計(jì)算兩個(gè)用戶的相似度。歐氏距離值越小,兩個(gè)用戶相似度越大;歐氏距離值越大,兩個(gè)用戶相似度越小。計(jì)算用戶U和用戶V的相似度公式如下:
[ Eu,v=i=1n(ui-vi)2]
其中,[ui]和[vi]表示用戶U和用戶V在共同評(píng)分的項(xiàng)目集中對(duì)物品的評(píng)分。當(dāng)數(shù)據(jù)很稠密并且連續(xù)時(shí),歐氏距離是很好的相似度計(jì)算方式。
3.2 推薦系統(tǒng)結(jié)構(gòu)圖
基于用戶的協(xié)同過(guò)濾推薦算法,依據(jù)用戶和物品的特征構(gòu)建用戶和物品的同現(xiàn)矩陣;然后根據(jù)用戶的行為數(shù)據(jù),計(jì)算用戶之間的相似度,得到相似用戶集合;最后采用協(xié)同過(guò)濾算法,給目標(biāo)用戶推薦相似用戶喜歡而其不知道的物品。主要流程如圖1所示,主要包括以下5個(gè)模塊:
(1)數(shù)據(jù)預(yù)處理模塊:提取物品特征和用戶行為數(shù)據(jù)。
(2)構(gòu)建用戶字典模塊:用字典表示每位用戶評(píng)論的電影和評(píng)分。
(3)余弦相似度:根據(jù)用戶字典模塊中的評(píng)分,計(jì)算用戶間的余弦相似度,生成該用戶的相似度集合。
(4)歐氏相似度:根據(jù)(3)中計(jì)算的該用戶相似度集合,計(jì)算該用戶的歐氏相似度。
(5)推薦模塊:根據(jù)計(jì)算的用戶相似度,給相似用戶按評(píng)分降序推薦N個(gè)物品。
4 推薦系統(tǒng)實(shí)現(xiàn)
4.1 數(shù)據(jù)集簡(jiǎn)介
本文試驗(yàn)采用ml-latest-small數(shù)據(jù)集[5],該數(shù)據(jù)集中有610個(gè)用戶和9742部電影,包含了100836個(gè)收視率和3683個(gè)標(biāo)簽應(yīng)用,產(chǎn)生100837條評(píng)分記錄,每一條記錄的評(píng)分為0.5-5的數(shù)字。
該數(shù)據(jù)集中的用戶均為隨機(jī)選擇,每個(gè)用戶不包含個(gè)人信息,所有被選中的用戶至少對(duì)20部電影進(jìn)行了評(píng)分。數(shù)據(jù)集收集的日期從1996年3月29日至2018年9月24日期間,于2018年9月26日創(chuàng)建。表1展示了評(píng)分?jǐn)?shù)據(jù)集中2個(gè)評(píng)分記錄的例子,包括用戶ID、物品ID、評(píng)分和時(shí)間戳。表2展示了電影數(shù)據(jù)集中2個(gè)電影信息的例子,包括物品ID、電影名和電影類型。
4.2 數(shù)據(jù)預(yù)處理
提取數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行預(yù)處理,將電影信息數(shù)據(jù)集中的電影ID、電影名稱和電影評(píng)分?jǐn)?shù)據(jù)集中的用戶ID和用戶評(píng)分依次讀出,建立物品和評(píng)分特征矩陣。其Python實(shí)現(xiàn)關(guān)鍵代碼[6]如下:
defReadData(movie,rating):
'''
提取數(shù)據(jù),并建立物品和評(píng)分特征矩陣
:param movies:表示電影信息數(shù)據(jù)集文件
:param ratings:表示電影評(píng)分?jǐn)?shù)據(jù)集文件
:return:返回特征矩陣,并按userId的值排序
'''
movies=pd.read_csv(movie)
ratings=pd.read_csv(rating)
merge_data=pd.merge(ratings,movies,on='movieId')
merge_data.sort_values('userId')
returnmerge_data
4.3 用python構(gòu)建用戶字典
根據(jù)物品和評(píng)分矩陣,將每位用戶評(píng)論的電影和評(píng)分存放在字典中。評(píng)分?jǐn)?shù)據(jù)用于計(jì)算用戶相似度,電影信息用于生成推薦結(jié)果。其Python實(shí)現(xiàn)關(guān)鍵代碼如下:
defcreat_dict(file):
'''
:param file: 表示由特征矩陣生成的文件
:return: 返回結(jié)果是由字典存放每位用戶評(píng)論的電影和評(píng)分
'''
data_dict={}
for line infile.readlines():
line=line.strip().split(',')
if not line[0] indata_dict.keys():
data_dict[line[0]]={line[3]:line[1]}
else:
data_dict[line[0]][line[3]]=line[1]
returndata_dict
4.4 相似度研究
1)用余弦相似度算法尋找相似用戶
從用戶字典中取出兩個(gè)用戶共同評(píng)分的電影,采用余弦相似度公式,計(jì)算兩個(gè)用戶間的相似度。其Python實(shí)現(xiàn)關(guān)鍵代碼如下:
defcos_sim(user1,user2):
#根據(jù)兩用戶共同評(píng)分的電影,計(jì)算兩者間的余弦相似度
user1_data=data_dict[user1]
user2_data=data_dict[user2]
common={}
forkeyin user1_data.keys():
ifkeyin user2_data .keys():
common[key]=1
iflen(common)==0:
return0
sum1Sq = sum([pow(float(user1_data[movie]),2) for movie in common])
sum2Sq = sum([pow(float(user2_data[movie]),2) for movie in common])
CSum=sum([float(user1_data[movie])*float(user2_data[movie]) for movie in common])
dist=sqrt(sum1Sq)*sqrt(sum2Sq)
ifden==0:
return 0
returnCSum/dist
2)用歐氏距離找出相似用戶
從用戶字典中取出兩用戶共同評(píng)分的電影,采用歐氏距離公式,計(jì)算兩用戶間的相似度。其Python實(shí)現(xiàn)關(guān)鍵代碼如下:
defEuclid_sim(user1,user2):
#根據(jù)兩用戶共同評(píng)論過(guò)的電影,計(jì)算兩者間的歐氏距離
user1_data=data_dict[user1]
user2_data=data_dict[user2]
distance=0
forkeyin user1_data.keys():
ifkeyin user2_data .keys():
distance +=pow(float(user1_data[key])-float(user2_data[key]),2)
return1/(1+sqrt(distance))
4.5 推薦模塊的實(shí)現(xiàn)
根據(jù)相似度用戶對(duì)電影的評(píng)分,對(duì)某個(gè)用戶未觀看過(guò)的電影進(jìn)行興趣推薦,并根據(jù)電影評(píng)分值降序進(jìn)行TOP-N推薦。本系統(tǒng)中為某個(gè)用戶推薦了評(píng)分排名前5的電影,其Python實(shí)現(xiàn)關(guān)鍵代碼如下:
defrecom_user(user):
#給user用戶推薦評(píng)分排名前5的電影
top_sim_user=top10_simliar(user)[0][0]
items=data_dict[top_sim_user]
recommendations=[]
foritemin items.keys():
ifitemnot in data_dict[user].keys():
recommendations .append((item,items[item]))
recommendations.sort(key=lambda val:val[1],reverse=True)
returnrecommendations[:5]
4.6 輸出推薦結(jié)果
調(diào)用主函數(shù),為用戶3推薦5部未觀看過(guò)的電影,得到推薦結(jié)果如圖2所示。
Recomm_user = recom_user('3')
for movie, rating in Recomm_user:
print('給3號(hào)用戶推薦的電影:%-25s' % movie, '評(píng)分:%.6f' % float(rating))
4.7 用戶相似度比較
圖3是用戶3通過(guò)兩種算法得到的用戶相似度比較結(jié)果。根據(jù)余弦相似度計(jì)算得到與用戶3相似的前10個(gè)用戶集合,從圖中可以看出此集合用戶與用戶3的余弦相似度值均接近于1,表示該集合用戶相似度非常高;同時(shí),此集合用戶與用戶3的歐氏距離值均在0—0.5之間,表示這10個(gè)用戶的歐氏相似度是正相關(guān)。
5 結(jié)語(yǔ)
本文依據(jù)推薦系統(tǒng)的相關(guān)技術(shù),構(gòu)建了推薦系統(tǒng)結(jié)構(gòu)圖,使用協(xié)同過(guò)濾算法和 Python語(yǔ)言實(shí)現(xiàn)了基于用戶的協(xié)同過(guò)濾推薦系統(tǒng),并通過(guò)實(shí)驗(yàn)驗(yàn)證了用戶相似度的算法。該系統(tǒng)具有普適性,可以在多個(gè)領(lǐng)域主動(dòng)為用戶推薦其感興趣的商品,滿足其個(gè)性化需求。在未來(lái)的工作中,將優(yōu)化算法,綜合構(gòu)建用戶興趣模型,進(jìn)一步提高推薦系統(tǒng)性能和推薦精度。
參考文獻(xiàn):
[1] Isinkaye F O,F(xiàn)olajimi Y O,Ojokoh B A.Recommendationsystems:Principles,methods and evaluation[J].Egyptian Informatics Journal,2015,16(3):261-273.
[2] 項(xiàng)亮.推薦系統(tǒng)實(shí)踐[M].北京:人民郵電出版社,2012.
[3] 李鋒,冷娜.協(xié)同過(guò)濾的紡織面料推薦系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2018,38(z2):115-118.
[4] 楊震,司書勇,李超陽(yáng).基于用戶隱式興趣模型的信息推薦技術(shù)研究[J].山東大學(xué)學(xué)報(bào),2017(52):1-7.
[5] The MovieLens Datasets: History and Context. ACM Transactions on Interactive Intelligent Systems (TiiS) 5, 4: 19:1-19:19. https://doi.org/10.1145/2827872.
[6] 董付國(guó).Python程序設(shè)計(jì)開發(fā)寶典[M].北京:清華大學(xué)出版社,2017.
【通聯(lián)編輯:光文玲】