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