日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

简单的豆瓣电影推荐系统demo

發(fā)布時(shí)間:2023/12/10 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的豆瓣电影推荐系统demo 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)單的豆瓣電影推薦系統(tǒng)demo

  • 前言
  • 背景介紹
  • 開發(fā)部分介紹
    • 數(shù)據(jù)獲取與存儲(chǔ)
    • 界面設(shè)計(jì)
  • 算法原理
    • 推薦算法與冷啟動(dòng)簡(jiǎn)述
    • 基于物品的協(xié)同過濾(ItemCF)
  • 功能展現(xiàn)
    • 界面
    • 算法
  • 小結(jié)
  • 參考

推薦畢設(shè)前的小項(xiàng)目demo,主要內(nèi)容是ItemCF+簡(jiǎn)單的系統(tǒng)開發(fā)

前言

本次實(shí)驗(yàn)學(xué)習(xí)如何利用python、MySQL作為開發(fā)環(huán)境(主要調(diào)用pymysql、request、json、numpy、pandas等python庫),通過爬取豆瓣電影數(shù)據(jù),實(shí)現(xiàn)了一個(gè)基于基于用戶協(xié)同過濾的簡(jiǎn)單推薦系統(tǒng)demo,筆者主要行文思路如下圖:

背景介紹

如果說互聯(lián)網(wǎng)的目標(biāo)是連接一切,哪推薦系統(tǒng)的功能與作用就是建立起更加有效率的連接,推薦系統(tǒng)可以連接用戶與內(nèi)容與服務(wù),可以為企業(yè)、政府等組織節(jié)省大量的成本,同時(shí)將有用的內(nèi)容精準(zhǔn)的投放到個(gè)性用戶里,大大節(jié)省用戶的時(shí)間成本。

開發(fā)部分介紹

數(shù)據(jù)獲取與存儲(chǔ)

本次實(shí)驗(yàn)數(shù)據(jù)獲取源選取自豆瓣電影,主要通過python中resquest庫對(duì)數(shù)據(jù)進(jìn)行爬取與處理,再通過pymysql庫實(shí)現(xiàn)對(duì)數(shù)據(jù)的存儲(chǔ)(此處未將數(shù)據(jù)全部導(dǎo)入SQL不作E-R圖展示),最終爬取數(shù)據(jù)構(gòu)成如下圖

界面設(shè)計(jì)

界面設(shè)計(jì)主要通過python中PyQT5庫進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)了初始的用戶登錄、用戶注冊(cè)與電影檢索等初始功能,同時(shí)再結(jié)合推薦算法,可以實(shí)現(xiàn)推薦系統(tǒng)中對(duì)初始用戶的冷啟動(dòng)、老用戶個(gè)性化推薦功能。初始界面如下圖所示:

算法原理

推薦算法與冷啟動(dòng)簡(jiǎn)述

推薦算法的初衷想法就是希望把商品、內(nèi)容精準(zhǔn)的推送到用戶手中,使得商品得到精準(zhǔn)的流量,幫助用戶省去選擇和尋找信息的時(shí)間成本。
從電影的推薦系統(tǒng)角度看推薦算法,推薦系統(tǒng)主要需要解決的問題是推薦系統(tǒng)的冷啟動(dòng)、推薦系統(tǒng)怎樣基于用戶的興趣推薦出準(zhǔn)確的內(nèi)容與信息?
對(duì)于推薦系統(tǒng)的冷系統(tǒng)的冷啟動(dòng)問題,主流解決思想有基于用戶的冷啟動(dòng)、基于物品的冷啟動(dòng)、基于非個(gè)性化的推薦,本次實(shí)驗(yàn)只考慮新用戶注冊(cè)的情況,不考慮新物品進(jìn)入系統(tǒng)的情況,故解決的是用戶的冷啟動(dòng)問題,解決思想是根據(jù)新用戶登入其自定義的個(gè)性標(biāo)簽(感興趣的電影類型)定義出一大致的粗粒度的個(gè)性化用戶畫像,再根據(jù)這個(gè)畫像做出一個(gè)個(gè)性化推薦的左端界面,右端界面為基于物品的熱度的熱門電影推薦。
完成用戶的“冷啟動(dòng)”后,系統(tǒng)得到足夠支撐推薦算法的用戶行為數(shù)據(jù),基于相關(guān)的推薦算法,可以對(duì)用戶做出更加精確的推薦。結(jié)合筆者所查文獻(xiàn)與資料,
常用推薦算法主要有:基于用戶的協(xié)同過濾推薦、基于物品的協(xié)同過濾推薦、隱語義模型的推薦、基于圖的推薦。結(jié)合所抓取數(shù)據(jù)的構(gòu)成與體量,采用基于用戶的協(xié)同過濾算法做系統(tǒng)的主要的推薦算法。

基于物品的協(xié)同過濾(ItemCF)

基于物品的協(xié)同過濾算法是目前業(yè)界應(yīng)用做多的算法,如:亞馬遜、YouTube其推薦算法基礎(chǔ)都是該算法。基于物品的協(xié)同過濾在解決物品數(shù)量一定,但用戶數(shù)量巨大的應(yīng)用場(chǎng)景上很有優(yōu)勢(shì),與本次實(shí)驗(yàn)解決問題類型相近故選用(豆瓣網(wǎng)站的電影數(shù)量是一定的,但是用戶數(shù)量巨大。)在本次實(shí)驗(yàn)中ItemCF算法的實(shí)現(xiàn)思想主要為以下兩個(gè)步驟:
1.計(jì)算物品間的相似度:
從物品上出發(fā),可以定義物品的相似度計(jì)算公式為:wij=∣N(i)∩N(j)∣∣N(i)∣w_{i j}=\frac{|N(i) \cap N(j)|}{|N(i)|}wij?=N(i)N(i)N(j)?
其中分母|N(i)|是喜歡物品i的用戶數(shù),分子∣N(i)∩N(j)∣{|N(i) \cap N(j)|}N(i)N(j)是既喜歡物品i同時(shí)也喜歡物品j的用戶數(shù)量。不難看出,公式的定義是喜歡物品i的用戶同時(shí)也喜歡物品j的用戶比例,該公式一定程度上可以反映物品i、j的相似程度,但是對(duì)于j是熱門物品的情況,其很多人都喜歡j,j的體量本身就很大,那么上述公式的計(jì)算結(jié)果 將接近于1,這對(duì)對(duì)于致力于挖掘長(zhǎng)尾信息的推薦來說顯然是一個(gè)不好的特性。因此,在此基礎(chǔ)上加入對(duì)物品j權(quán)重的懲罰,得到改進(jìn)的相似度計(jì)算公式為:
計(jì)算物品相似度的算法部分實(shí)現(xiàn)思路為:
(1)建立用戶-物品倒排表(對(duì)每個(gè)用戶建立一個(gè)其喜歡的物品的列表);
(2)對(duì)于每個(gè)用戶,將其的物品列表兩兩在共現(xiàn)矩陣中加1;
(3)將各用戶的共現(xiàn)矩陣相加得到總的共現(xiàn)矩陣C;
(4)將C矩陣歸一化即得到物品之間的余弦相似矩陣W。
形象的實(shí)現(xiàn)思路如圖:

2.根據(jù)物品相似度和用戶的歷史行為生成個(gè)性化的推薦列表:
在計(jì)算得到物品間的相似度后,再同如下公式計(jì)算得到用戶u對(duì)物品j的興趣:puj?=∑i=N(u)∩s(j,K)wjiruip_{\text {uj }}=\sum_{i=N(u) \cap s(j, K)} w_{j i} r_{u i} puj??=i=N(u)s(j,K)?wji?rui?
其中N(u)是用戶喜歡的物品的集合,S(j,K)是和物品j最相似的K個(gè)物品集合,s(j,K)是與物品j最相似的K個(gè)物品的集合,wij是物品i與物品j的相似度,rui是用戶u對(duì)物品j的興趣。(在隱反饋數(shù)據(jù)集中,如果用戶u對(duì)i有過行為,即可令rui=1),不難看出,該公式的含義為:和用戶歷史上感興趣的物品越相似的物品,越有可能在用戶的推薦列表中排名越高。
生成個(gè)性化用戶推薦列表的算法部分實(shí)現(xiàn)思想如下:
(1)計(jì)算用戶u對(duì)各個(gè)物品的興趣得分;
(2)按照用戶u對(duì)各物品的興趣得分按從大到小排序后生成推薦列表。
形象化的實(shí)現(xiàn)思路如圖:

python實(shí)現(xiàn):

import pandas as pd import numpy as np import random from sklearn.metrics.pairwise import cosine_similarity # 計(jì)算余弦相似度# 用戶ID映射 usersMap = dict(enumerate(list(user_df['user_id'].unique()))) # 電影id與其對(duì)應(yīng)索引的映射關(guān)系 usersMap = dict(zip(usersMap.values(), usersMap.keys())) # 鍵值互換# 電影ID映射 moviesMap_raw = dict(enumerate(list(movies_df['dataID']))) # 電影id與其對(duì)應(yīng)索引的映射關(guān)系 moviesMap = dict(zip(moviesMap_raw.values(), moviesMap_raw.keys())) # 鍵值互換n_users = user_df.user_id.unique().shape[0] # 用戶總數(shù) n_movies = movies_df.Movie_ID.unique().shape[0] # 電影總數(shù)data_matrix = np.zeros((n_users, n_movies)) # 用戶-物品矩陣雛形# 構(gòu)造用戶-物品矩陣 for line in user_df.itertuples():try:data_matrix[usersMap[str(line[1])], moviesMap[line[2]]] = line[3]except:pass# 電影余弦相似度矩陣 item_similarity = cosine_similarity(data_matrix.T) # 轉(zhuǎn)置之后計(jì)算的才是電影的相似度def rec_hot_movies():"""@功能: 獲取熱門推薦電影@參數(shù): 無@返回: 熱門推薦電影列表"""hot_movies = []hot_movies_raw = movies_df[movies_df.date >= 2019]hot_movies_raw = hot_movies_raw[hot_movies_raw.rate >= 8.7]hot_movies_raw = hot_movies_raw.iloc[:,[1,2,3,4,5,6,7,9]]for i in list(hot_movies_raw):temp = []for j in range(len(list(hot_movies_raw.name.unique()))):temp.append(hot_movies_raw['{}'.format(i)].values.tolist()[j])hot_movies.append(temp)hot_rec_movies = [] # 存儲(chǔ)熱門推薦電影for k in range(len(hot_movies[0])):temp_rec_movies = []for l in range(len(hot_movies)):temp_rec_movies.append(hot_movies[l][k])hot_rec_movies.append(temp_rec_movies)return hot_rec_moviesdef Recommend(movie_id, k): # movie_id:電影名關(guān)鍵詞,k:為最相似的k部電影"""@功能: 獲得推薦電影列表@參數(shù): 電影ID、每部電影選取最相似的數(shù)目@返回: 推薦電影列表"""movie_list = [] # 存儲(chǔ)結(jié)果try:# 過濾電影數(shù)據(jù)集,搜索找到對(duì)應(yīng)的電影的idmovieid = list(movies_df[movies_df['dataID'] == movie_id].Movie_ID)[0]# 獲取該電影的余弦相似度數(shù)組movie_similarity = item_similarity[movieid]# 返回前k個(gè)最高相似度的索引位置movie_similarity_index = np.argsort(-movie_similarity)[1:k+1] # argsort函數(shù)是將數(shù)組元素從小到大排列,返回對(duì)應(yīng)的索引數(shù)組for i in movie_similarity_index:rec_movies = [] # 每部推薦的電影rec_movies.append(list(movies_df[movies_df.Movie_ID == (i)].name)[0]) # 電影名rec_movies.append(list(movies_df[movies_df.Movie_ID == (i)].actors)[0]) # 主演if pd.isna(list(movies_df[movies_df.Movie_ID == (i)].style2)[0]) and pd.isna(list(movies_df[movies_df.Movie_ID == (i)].style3)[0]):style = list(movies_df[movies_df.Movie_ID == (i)].style1)[0]elif pd.isna(list(movies_df[movies_df.Movie_ID == (i)].style3)[0]):style = list(movies_df[movies_df.Movie_ID == (i)].style1)[0] + ' ' + list(movies_df[movies_df.Movie_ID == (i)].style2)[0]else:style = list(movies_df[movies_df.Movie_ID == (i)].style1)[0] + ' ' + list(movies_df[movies_df.Movie_ID == (i)].style2)[0] + ' ' + list(movies_df[movies_df.Movie_ID == (i)].style3)[0]rec_movies.append(style) # 電影類型rec_movies.append(list(movies_df[movies_df.Movie_ID == (i)].rate)[0]) # 電影評(píng)分rec_movies.append(list(movies_df[movies_df.Movie_ID == (i)].url)[0]) # 電影鏈接movie_list.append(rec_movies) # 列表中的元素為列表,存儲(chǔ)相關(guān)信息except:passreturn movie_listdef find_user_like(user_id):user_seen_movies = user_df[user_df['user_id'] == '{}'.format(user_id)].movie_id # 用戶看過的電影的IDuserlike_movies = [] # 儲(chǔ)存用戶比較喜歡的電影IDfor i in list(user_seen_movies):if list(user_df[user_df['movie_id'] == i].rating)[0] >=4:userlike_movies.append(list(user_df[user_df['movie_id'] == i].movie_id)[0]) # 找出用戶比較喜歡的電影的IDuser_like_movies = [] # 儲(chǔ)存用戶喜歡的隨機(jī)5部try:for i in range(5):user_like_movies.append(random.choice(userlike_movies))rec = []for each in user_like_movies:rec.extend(Recommend(each,7))except:return Nonereturn rec# 代碼實(shí)現(xiàn)參考開發(fā)者許繼元

功能展現(xiàn)

界面

用戶的登錄與注冊(cè)


界面檢索


算法

推薦系統(tǒng)的冷啟動(dòng):

基于用戶行為數(shù)據(jù)與ItemCF算法的推薦:
通過對(duì)推薦系統(tǒng)中的電影進(jìn)行打分形成行為數(shù)據(jù)后生成的推薦如圖:

小結(jié)

本次實(shí)驗(yàn)通過python與MySQL實(shí)現(xiàn)推薦系統(tǒng)開發(fā)部分、ItemCF算法與基于用戶的冷啟動(dòng)實(shí)現(xiàn)了對(duì)新老用戶的個(gè)性化推薦、最終算法實(shí)現(xiàn)+簡(jiǎn)答系統(tǒng)開發(fā)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的推薦demo。通過本次實(shí)驗(yàn),筆者學(xué)習(xí)到了推薦算法與簡(jiǎn)單的推薦系統(tǒng)開發(fā)知識(shí),基本完成了一個(gè)簡(jiǎn)單推薦的從算法到簡(jiǎn)單開發(fā)的流程,但在的界面的美觀設(shè)計(jì)、算法的多樣性實(shí)現(xiàn)用戶的個(gè)性化推薦、實(shí)際業(yè)務(wù)契合度等方面仍有待提高,有待未來進(jìn)一步研究解決。同時(shí)感謝開發(fā)er許繼元github項(xiàng)目的資料幫助,沒有這個(gè)項(xiàng)目提供的收獲,筆者可能無法短時(shí)間內(nèi)完成這個(gè)demo,感謝幫助!

參考

[1]項(xiàng)亮.《推薦系統(tǒng)實(shí)踐》.人民郵電出版社,2012.6
[2]許繼元.DoubanMovieRecommendationSystem.github,2020.5

總結(jié)

以上是生活随笔為你收集整理的简单的豆瓣电影推荐系统demo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。