資源簡介
這是我參考網上資料后自己寫的基于用戶的協同過濾算法,包括算法所用到的數據集及相關代碼,基于Python實現,代碼包含詳細解釋。

代碼片段和文件信息
#?-*-?coding=utf-8?-*-
import?math
import?sys
from?texttable?import?Texttable
#pearson相關系數計算相似余弦距離
def?calCosDist(user1user2):?#user1user2表示[(電影id1評分)…]
????x=0.0
????y=0.0
????avg_x=0.0
????avg_y=0.0
????sum_xy=0.0
????sum_x=0.0
????sum_y=0.0
????for?i?in?user1:
????????x+=i[1]
????avg_x=x/len(user1)
????for?j?in?user2:
????????y+=j[1]
????avg_y=y/len(user2)
????for?m?in?user1:
????????for?n?in?user2:
????????????if?m[0]==n[0]:?#與特定用戶相同的電影才進行評分加權
????????????????sum_xy+=(m[1]-avg_x)*(n[1]-avg_y)
????????????????sum_y+=(n[1]-avg_y)*(n[1]-avg_y)
????????sum_x+=(m[1]-avg_x)*(m[1]-avg_x)
????xx_yy=math.sqrt(sum_x*sum_y)
????return?sum_xy/xx_yy
#讀取文件
def?readFile(fileData):
????data=[]
????rates=[]
????f=open(fileData“r“)
????data=f.readlines()
????f.close()
????for?line?in?data:
????????dataLine=line.split(“\t“)
????????rates.append([int(dataLine[0])int(dataLine[1])int(dataLine[2])])
????return?rates
#創建字典,生成用戶評分的數據結構
#???輸入:數據集合,格式:用戶id\t硬盤id\t用戶評分
#???輸出:1.用戶字典:dic[用戶id]=[(電影id電影評分)...]
#????????2.電影字典:dic[電影id]=[用戶id1用戶id2...]
def?createDict(rates):
????user_dict={}
????movie_dict={}
????for?i?in?rates:
????????if?i[0]?in?user_dict:
????????????user_dict[i[0]].append((i[1]i[2]))
????????else:
????????????user_dict[i[0]]=[(i[1]i[2])]
????????if?i[1]?in?movie_dict:
????????????movie_dict[i[1]].append(i[0])
????????else:
????????????movie_dict[i[1]]=[i[0]]
????return?user_dictmovie_dict
#找出與用戶相關的所有用戶并排序
def?findSimilarUser(user_iduser_dictmovie_dict):
????neighbors=[]
????neighbors_dist=[]
????for?movie?in?user_dict[user_id]:
????????for?neighbor?in?movie_dict[movie[0]]:
????????????if?neighbor?!=user_id?and?neighbor?not?in?neighbors:
????????????????neighbors.append(neighbor)?#neighbors表示與特定用戶評論過相同電影的所有用戶
????for?neighbor?in?neighbors:
????????dist=calCosDist(user_dict[user_id]user_dict[neighbor])
????????neighbors_dist.append([distneighbor])
????neighbors_dist.sort(reverse=True)
????return?neighbors_dist
#???使用UserCF進行推薦
#???輸入:用戶ID用戶字典,電影字典,鄰居數量
#???輸出:推薦的電影排序及相關用戶
def?userCF(user_iduser_dictmovie_dictK):
????movies={}
????movie_sort=[]
????user_similar=findSimilarUser(user_iduser_dictmovie_dict)[:K]#找出與指定用戶相關性最大的K個用戶;user_similar=[相關性大小,用戶id]
????for?user?in?user_similar:
????????for?i?in?user_dict[user[1]]:??#將前K個用戶的id逐個取出來
????????????if?i[0]?not?in?movies:????#第一次迭代中,i[0]表示第一個用戶評論過的電影id1
????????????????movies[i[0]]=user[0]??#movies是一個字典;第一次迭代中,表示將第一個用戶與特定用戶的相關性加到電影id1上,后續迭代如果有其他用戶也評論了電影id1,也將其用戶相關性加到電影id1上
????????????else:
????????????????movies[i[0]]+=user[0]?#得到K個用戶所評論的所有電影的加權和。如果某部電影有5個用戶評論過,則將這5個用戶與特定用戶的相關性相加,得到特定用戶對某部電影的感興趣程度
#對電影相關性排序
????for?key?in?movies:??#movies是一個字典;movies={電影id1:特定用戶對id1的感興趣程度,……}
????????movie_sort.append([movies[key]key])?#movie_sort是一個列表,movie_sort=[[特定用戶對id1的感興趣程度電影id1]……]
????movie_sort.sort(reverse=True)?#將特定用戶對所有電影的感興趣程度進行排序,這里的所有電影指K個用戶所評論的所有電影
????return?movie_sort
#獲取電影列表
def?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-02-18?15:52??基于用戶的協同過濾算法數據集及實現代碼\
?????目錄???????????0??2017-02-18?15:52??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\
?????文件????????6750??2016-01-30?04:26??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\README
?????文件?????????716??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\allbut.pl
?????文件?????????643??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\mku.sh
?????文件?????1979173??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.data
?????文件?????????202??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.genre
?????文件??????????36??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.info
?????文件??????236344??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.item
?????文件?????????193??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.occupation
?????文件???????22628??2000-07-20?05:09??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u.user
?????文件?????1586544??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u1.ba
?????文件??????392629??2001-03-09?02:32??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u1.test
?????文件?????1583948??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u2.ba
?????文件??????395225??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u2.test
?????文件?????1582546??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u3.ba
?????文件??????396627??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u3.test
?????文件?????1581878??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u4.ba
?????文件??????397295??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u4.test
?????文件?????1581776??2001-03-09?02:34??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u5.ba
?????文件??????397397??2001-03-09?02:33??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\u5.test
?????文件?????1792501??2001-03-09?02:34??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\ua.ba
?????文件??????186672??2001-03-09?02:34??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\ua.test
?????文件?????1792476??2001-03-09?02:34??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\ub.ba
?????文件??????186697??2001-03-09?02:34??基于用戶的協同過濾算法數據集及實現代碼\ml-100k\ub.test
?????文件????????5060??2017-02-18?15:39??基于用戶的協同過濾算法數據集及實現代碼\userCFbyMyself.py
評論
共有 條評論