標籤:

《推薦系統實踐》學習筆記(按照用戶相似度推薦電影)

import pandas as pdfrom sklearn.model_selection import train_test_split#用pd.read_table讀取數據users=pd.read_table(rD: rain
ecommendml-1m/users.dat,sep=::,header=None, names=[user_id,gender,age,occupation,zip])movies = pd.read_table(rD: rain
ecommendml-1m/movies.dat, sep=::, header=None, names=[movie_id, title, genres])ratings = pd.read_table(rD: rain
ecommendml-1m/ratings.dat, sep=::, header=None, names=[user_id, movie_id, rating, timestamp])all_data = pd.merge(pd.merge(ratings, users), movies)#只保留評價用戶相關的電影信息data = DataFrame(data=all_data,columns=[user_id,movie_id])data = pd.read_csv(rD: rain
ecommendml-1mdata.csv)#練慣用數據集只取1%data1,data2 = train_test_split(data,test_size=0.01, random_state=42) data_user = data2[user_id]data_movie = data2[movie_id]#為識別用戶id和電影id,用戶id增加『u』,電影id增加『m』def addu(x): if isinstance(x,int): new_x = str(x) + u return new_xdef addm(x): if isinstance(x,int): new_x = str(x) + m return new_xdata_userid = data_user.apply(addu)data_movieid = data_movie.apply(addm)#建立電影用戶的倒排表,對於每個電影都保存對該電影產生評價的用戶列表users_item = dict()for i in range(len(data_userid)): item = data_movie.iloc[i]#電影 user = data_userid.iloc[i]#用戶 #movie_id為字典user_item的鍵,且值類型為集合,user_id作為鍵movie_id的值 if item not in users_item: users_item[item] = set() users_item[item].add(user) #建立用戶電影的倒排表,對於每個用戶都保存其評價的電影列表 movies_item = dict()for i in range(len(data_movieid)): movie = data_movieid.iloc[i]#電影 item = data_userid.iloc[i]#用戶 #user_id為字典movie_item的鍵,且值類型為集合,movie_id作為鍵user_id的值 if item not in movies_item: movies_item[item] = set() movies_item[item].add(movie) N = {} #每個用戶評價電影的個數C = {} #用戶評價相同電影的次數#遍歷所有電影及電影對應的評價的用戶for i , users in users_item.items(): #遍歷一個電影的所有評價用戶 for u in users: #得到字典N--用戶 :對每個電影評價次數 N.setdefault(u,0)#如果沒有鍵:u,則新增鍵:u,並設置它的值為0 #對於電影i,用戶u的評價次數 N[u] = N[u] + 1#字典N的鍵u出現一次值增加1 #對於電影i,用戶u和用戶v同時評價次數 C.setdefault(u,{})#字典C中如果沒有鍵:u,則新建鍵u,並設置它的值為一個字典 #遍歷一個用戶 for v in users: if v == u: continue #對於電影i,用戶u評價時用戶v的評價次數 C[u].setdefault(v,0) #對於電影i,用戶u和用戶v同時評價次數 C[u][v] += 1#用戶出現的次數#構建相似度矩陣import mathW = C.copy()for u , related_users in C.items(): for v , cuv in related_users.items(): W[u][v] = cuv / math.sqrt(N[u] * N[v])#定義推薦電影函數def recommend(user,movies_item,W,K): rank = {} #用戶已經評價過的電影 interacted_items = movies_item[user] #找到與user相似度接近的K個用戶,並獲取與這些用戶的相似度 for v, wuv in sorted(W[user].items(),reverse=True)[0:K]: for i in movies_item[v]:#循環相似度前K個用戶的評價的電影 if i not in interacted_items:#排除用戶本身已經評價的電影 rank.setdefault(i,0) rank[i] = rank[i] + wuv return rank

推薦閱讀:

推薦系統:Attention Model
推薦系統:Next Basket Recommendation
從演算法到案例:推薦系統必讀的10篇精選技術文章

TAG:推薦系統 |