movielens推荐系统_浅谈推荐系统+3个小时上手python实现(完整代码)
已經9012年了應該也不需要我解釋什么是推薦系統,大致就像頭圖一樣,挖掘用戶的喜好,精準的推送給用戶ta想要的東西!推薦系統可以說是無處不在了,電商的猜你喜歡,瀏覽器右側的推送消息,包括搜索結果的排序,廣義來說都算推薦系統的一部分。而且據聽說(沒錯,是聽說的,因為沒有找到切實的數據來源),推薦系統給亞馬遜帶來了35%的銷售收入,給Netflix帶來了高達75%的消費,并且Youtube主頁上60%的瀏覽來自推薦服務。推薦系統的重要性可見一斑! 同志們必須要學起來遼!
因為目標是讓在座的各位一天就可以用Python先上手一波推薦系統,所以這篇也只是淺談和概括推薦系統的相關知識啦!
目的是一切action的驅動力!
推薦系統的目的是:
表現形式:
技術:
2. Item-to-Item 根據產品推薦相關產品
3. Based on 用戶基礎信息
4. 關聯規則挖掘
......... 還有很多算法技術,先不做累述,直接上手協同過濾歐式距離算法。
協同過濾算法解析:
協同過濾中的“同”代表要找出有共同經驗的群體;
為特定用戶找到他真正感興趣的內容的好方法是,首先找到與此用戶有相似興趣的其他用戶,然后將他們感興趣的內容推薦給此用戶。
現在我們的目標是為User1找到可推薦的電影。
梳理步驟:
(一)、首先想象我們要這樣一個表格:
橫坐標,假設有10w部電影,所以橫坐標有10w個movie_id,數據來源自數據庫
縱坐標,假設有100w個用戶,所以縱坐標有100w個user_id,數據也來自數據庫
交叉處,“1”代表用戶喜愛這部電影,數據來自日志(例如瀏覽過,查找過,點贊過,)
"空白"代表用戶不喜愛這部電影,因為沒有任何瀏覽日志
(二)、找到用戶A(user_id_1)的興趣愛好
如圖:用戶user_id_1喜歡電影{m1,m2,m3}
(三)、找到與用戶A(user_id_1)具有相同電影興趣愛好的用戶群體集合Set<user_id>
(四)、 找到該群體喜歡的電影集合Set<movie_id>
如圖具備相同喜好的用戶{u2, u3},還喜好的電影集合是{..., m10000} (橘色的位置)(五)、未來用戶(use_id_1)來訪問網站時,要推薦電影{..., m10000}給ta。
Python 實現步驟
第一步:計算兩者之間的相似度
a.曼哈頓距離計算(計算迅速,節省時間)
b.歐氏距離計算(計算兩個點之間的直線距離) 本文采用歐式距離
數據我已備好,是一個有關movie 的數據集,數據包含138,000 個用戶對27,000 個電影的評價,評價分為0-5,數據集詳細介紹點擊MovieLens。
點擊下面鏈接獲取數據,解壓,讀入Python
數據 ranking : ml-latest-small(1MB):
http://files.grouplens.org/datasets/movielens/ml-latest-small.zip?files.grouplens.org數據movies: ml-latest(234.2MB):
http://files.grouplens.org/datasets/movielens/ml-latest.zip?files.grouplens.org數據格式如下:
pip ranking 數據集的數據格式movies = pd.read_csv('Desktop/movies.csv') print(movie.head(5))movies數據集的數據格式合并兩個數據集,通過匹配movie_id
data = pd.merge(movies,ratings,on = 'movieId') print(data.head(5)) data[['userId','rating','movieId','title']].sort_values('userId').to_csv('Desktop/data.csv',index=False) # 將合并后的數據集輸出保存到桌面 以備后續分析 files = pd.read_csv('Desktop/data.csv') print(file.head(5))合并后數據集的數據格式
采用python字典來表示每位用戶評論的電影和評分
計算任何兩位用戶之間的相似度,由于每位用戶評論的電影不完全一樣,所以首先要找到兩位用戶共同評論過的電影
然后計算兩者之間的歐式距離,最后算出兩者之間的相似度。
from math import * def Euclidean(user1,user2):#取出兩位用戶評論過的電影和評分user1_data=data[user1]user2_data=data[user2]distance = 0#找到兩位用戶都評論過的電影,并計算歐式距離for key in user1_data.keys():if key in user2_data.keys():#注意,distance越大表示兩者越相似distance += pow(float(user1_data[key])-float(user2_data[key]),2)return 1/(1+sqrt(distance))#這里返回值越小,相似度越大#計算某個用戶與其他用戶的相似度 def top10_simliar(userID):res = []for userid in data.keys():#排除與自己計算相似度if not userid == userID:simliar = Euclidean(userID,userid)res.append((userid,simliar))res.sort(key=lambda val:val[1])return res[:4]RES = top10_simliar('1') print(RES) # 用戶之間相似度結果:0表示兩位的影評幾乎一樣,1表示沒有共同的影評根據相似度來推薦用戶:
def recommend(user):#相似度最高的用戶top_sim_user = top10_simliar(user)[0][0]#相似度最高的用戶的觀影記錄items = data[top_sim_user]recommendations = []#篩選出該用戶未觀看的電影并添加到列表中for item in items.keys():if item not in data[user].keys():recommendations.append((item,items[item]))recommendations.sort(key=lambda val:val[1],reverse=True)#按照評分排序#返回評分最高的10部電影return recommendations[:10]Recommendations = recommend('1') print(Recommendations) 推薦結果好了,簡版推薦系統結束。
但是我們需要不斷完善這個推薦系統,例如,我們使用兩個用戶對相同電影的評分來計算相似度其實不夠準確,因為兩個用戶的評價標準不同,有的人對電影評價整體偏高(認為最差的也能給到3.5分),有的人對電影評價偏低(認為最好的電影也只給3.5分),所以在計算的過程中,應該分別減去兩個用戶對電影的整體評分,以修正相似度。下期更~
總結
以上是生活随笔為你收集整理的movielens推荐系统_浅谈推荐系统+3个小时上手python实现(完整代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 滤波_MATLAB之简单卡
- 下一篇: websocket python爬虫_p