数据挖掘-电影推荐系统
背景
隨著Internet的日漸普及,人們對(duì)于看電影的需求不單單只是到電影院購(gòu)買(mǎi)一張電影票這么簡(jiǎn)單了。手機(jī)、電腦上各種觀影軟件填補(bǔ)了許多人對(duì)于電影的渴望,但是如何能夠在視頻軟件中快速、準(zhǔn)確地定位到用戶喜歡什么電影這種看不見(jiàn)摸不著的想法,成為了開(kāi)發(fā)者一直探討的問(wèn)題。電影推薦系統(tǒng)在此種情景下應(yīng)運(yùn)而生,2006年Netflix的百萬(wàn)美金大賽將此類(lèi)技術(shù)推向高潮,在那之后的十余年間,各種電影推薦算法層出不窮,對(duì)于用戶的喜好判斷也越來(lái)越精準(zhǔn)。本次大作業(yè)是基于不同類(lèi)型的電影受不同職業(yè)人群的歡迎程度來(lái)做的電影推薦,以平均評(píng)價(jià)為一項(xiàng)指標(biāo)來(lái)推薦用戶想要的電影。
技術(shù)路線
1.1已有相關(guān)技術(shù)介紹
已有的實(shí)現(xiàn)電影推薦的代碼主要使用了以下技術(shù):
一、 基于用戶的協(xié)同過(guò)濾(User Collaborative Filtering,簡(jiǎn)稱(chēng) UserCF)通過(guò)用戶對(duì)不同內(nèi)容(物品)的行為,來(lái)評(píng)測(cè)用戶之間的相似性,找到“鄰居”基于這種相似性做出推薦。
二、 基于物品的協(xié)同過(guò)濾(Item Collaboration Filter,簡(jiǎn) 稱(chēng)ItemCF)算法給用戶推薦那些和他們之前喜歡的物品相似的物品。
1.2團(tuán)隊(duì)使用相關(guān)技術(shù)介紹
一、團(tuán)隊(duì)設(shè)計(jì)新的電影推薦系統(tǒng)時(shí)設(shè)計(jì)思路如下:
1.將電影信息及觀影用戶相關(guān)聯(lián)
電影的種類(lèi)和風(fēng)格以及其他詳細(xì)參數(shù),會(huì)影響到觀影人數(shù),以及觀影人數(shù)的評(píng)分,考慮電影本身和電影的受眾,有助于提高電影推薦的準(zhǔn)確度。
2.分析觀影用戶的相關(guān)信息
對(duì)于不同電影的觀影人數(shù)以及觀影人數(shù)的評(píng)分進(jìn)行統(tǒng)計(jì)。
3.統(tǒng)計(jì)電影評(píng)分TOP N
電影的評(píng)分是用戶對(duì)未知電影的數(shù)據(jù)參考,這一數(shù)據(jù)將從極大程度上影響用戶對(duì)電影的選擇。
二、團(tuán)隊(duì)在已有技術(shù)基礎(chǔ)上設(shè)計(jì)新的電影推薦系統(tǒng)時(shí)使用了以下算法與技術(shù):
1.surprise的使用
● 在推薦系統(tǒng)的建模過(guò)程中,我們將用到python庫(kù) Surprise(Simple Python Recommendation System Engine),是scikit系列中的一個(gè)。
● 簡(jiǎn)單易用,同時(shí)支持多種推薦算法:
? 基礎(chǔ)算法/baseline algorithms
? 基于近鄰方法(協(xié)同過(guò)濾)/neighborhood methods
? 矩陣分解方法/matrix factorization-based (SVD, PMF, SVD++, NMF)
2.協(xié)同過(guò)濾
兩種協(xié)同過(guò)濾算法及其適用場(chǎng)景:
UserCF更適合對(duì)新穎性要求高的場(chǎng)景,比如新聞推薦,很少有用戶只看某個(gè)話題的新聞,主要是因?yàn)檫@個(gè)話題不可能保證每天都有新的消息,而這個(gè)用戶卻是每天都要看新聞的。
ItemCF更適合用戶興趣穩(wěn)定的場(chǎng)景,如購(gòu)書(shū)、音樂(lè)和電影推薦。在這些場(chǎng)景中,用戶的興趣是比較固定和持久的,這些網(wǎng)站中個(gè)性化推薦的任務(wù)是幫助用戶發(fā)現(xiàn)和其興趣領(lǐng)域相關(guān)的物品。
二、結(jié)果展示
2.1 數(shù)值結(jié)果展示
第一模塊:
輸入電影類(lèi)別號(hào)顯示喜愛(ài)該類(lèi)電影的職業(yè)前三位:
`import numpy as np
import math
#讀取u.data數(shù)據(jù)
def load_data():
data = []
f = open(‘ml-100k/u.data’)
for i in range(100000):
h = f.readline().split(’\t’)
h = list(map(int, h))
data.append(h[0:3])
f.close()
return data
#讀取item類(lèi)別數(shù)據(jù)
def load_class_data():
id_and_class = []
f = open(‘ml-100k/u.item’,encoding=‘ISO-8859-1’)
for i in range(1682):
h = f.readline().split(’|’)
id_and_class.append([int(h[0])])
h = list(map(int,h[5:]))
id_and_class[i].append(h)
f.close()
return id_and_class
#讀取user工作數(shù)據(jù)
def load_job():
user_job = []
f = open(‘ml-100k/u.user’)
for i in range(943):
h = f.readline().split(’|’)
user_job.append([int(h[0])])
user_job[i].append(h[3])
f.close()
return user_job
#處理u.data數(shù)據(jù),制成user-item評(píng)分表
def user_cf_data(data):
rate = []
for i in range(943):
rate.append([])
for j in range(1682):
rate[i].append(0)
for h in data:
rate[h[0] - 1][h[1] - 1] = h[2]
return rate
#獲取所選種類(lèi)電影id列表
def class_id(data,num):
id_list = []
for i in range(1682):
if data[i][1][num] == 1:
id_list.append(data[i][0])
return id_list
#獲取各個(gè)職業(yè)對(duì)該種類(lèi)電影滿分評(píng)價(jià)次數(shù)
def single_favorite_job(data, id_list, user_job):
n = len(id_list)
list_favrite = []
for i in range(21):
list_favrite.append(0)
for i in range(n):
for j in range(943):
if data[j][id_list[i]-1] == 5:
if user_job[j][1] == ‘a(chǎn)dministrator’:
list_favrite[0] += 1
elif user_job[j][1] == ‘a(chǎn)rtist’:
list_favrite[1] += 1
elif user_job[j][1] == ‘doctor’:
list_favrite[2] += 1
elif user_job[j][1] == ‘educator’:
list_favrite[3] += 1
elif user_job[j][1] == ‘engineer’:
list_favrite[4] += 1
elif user_job[j][1] == ‘entertainment’:
list_favrite[5] += 1
elif user_job[j][1] == ‘executive’:
list_favrite[6] += 1
elif user_job[j][1] == ‘healthcare’:
list_favrite[7] += 1
elif user_job[j][1] == ‘homemaker’:
list_favrite[8] += 1
elif user_job[j][1] == ‘lawyer’:
list_favrite[9] += 1
elif user_job[j][1] == ‘librarian’:
list_favrite[10] += 1
elif user_job[j][1] == ‘marketing’:
list_favrite[11] += 1
elif user_job[j][1] == ‘none’:
list_favrite[12] += 1
elif user_job[j][1] == ‘other’:
list_favrite[13] += 1
elif user_job[j][1] == ‘programmer’:
list_favrite[14] += 1
elif user_job[j][1] == ‘retired’:
list_favrite[15] += 1
elif user_job[j][1] == ‘salesman’:
list_favrite[16] += 1
elif user_job[j][1] == ‘scientist’:
list_favrite[17] += 1
elif user_job[j][1] == ‘student’:
list_favrite[18] += 1
elif user_job[j][1] == ‘technician’:
list_favrite[19] += 1
elif user_job[j][1] == ‘writer’:
list_favrite[20] += 1
return list_favrite
#獲取各個(gè)職業(yè)對(duì)所有電影滿分評(píng)價(jià)次數(shù)
def total_favorite_job(data, user_job):
list_favrite = []
for i in range(21):
list_favrite.append(0)
for i in range(1682):
for j in range(943):
if data[j][i] == 5:
if user_job[j][1] == ‘a(chǎn)dministrator’:
list_favrite[0] += 1
elif user_job[j][1] == ‘a(chǎn)rtist’:
list_favrite[1] += 1
elif user_job[j][1] == ‘doctor’:
list_favrite[2] += 1
elif user_job[j][1] == ‘educator’:
list_favrite[3] += 1
elif user_job[j][1] == ‘engineer’:
list_favrite[4] += 1
elif user_job[j][1] == ‘entertainment’:
list_favrite[5] += 1
elif user_job[j][1] == ‘executive’:
list_favrite[6] += 1
elif user_job[j][1] == ‘healthcare’:
list_favrite[7] += 1
elif user_job[j][1] == ‘homemaker’:
list_favrite[8] += 1
elif user_job[j][1] == ‘lawyer’:
list_favrite[9] += 1
elif user_job[j][1] == ‘librarian’:
list_favrite[10] += 1
elif user_job[j][1] == ‘marketing’:
list_favrite[11] += 1
elif user_job[j][1] == ‘none’:
list_favrite[12] += 1
elif user_job[j][1] == ‘other’:
list_favrite[13] += 1
elif user_job[j][1] == ‘programmer’:
list_favrite[14] += 1
elif user_job[j][1] == ‘retired’:
list_favrite[15] += 1
elif user_job[j][1] == ‘salesman’:
list_favrite[16] += 1
elif user_job[j][1] == ‘scientist’:
list_favrite[17] += 1
elif user_job[j][1] == ‘student’:
list_favrite[18] += 1
elif user_job[j][1] == ‘technician’:
list_favrite[19] += 1
elif user_job[j][1] == ‘writer’:
list_favrite[20] += 1
return list_favrite
#計(jì)算各個(gè)職業(yè)對(duì)該類(lèi)電影滿分評(píng)價(jià)占對(duì)所有電影滿分評(píng)價(jià)百分比
def cala_percent(single_favorite,total_favorite):
percent_favorite = []
for i in range(21):
percent_favorite.append(float(single_favorite[i])/float(total_favorite[i]))
return percent_favorite
#排序并輸出結(jié)果
def print_favorite_job(percent_favorite):
f = open(‘ml-100k/u.occupation’)
job = []
for i in range(21):
h = f.readline().split(’\n’)
job.append(h[0])
f.close()
for i in range(21):
for j in range(20-i):
if percent_favorite[j] < percent_favorite[j+1]:
mid = percent_favorite[j]
percent_favorite[j] = percent_favorite[j+1]
percent_favorite[j+1] = mid
mid = job[j]
job[j] = job[j+1]
job[j+1] = mid
print(‘最喜愛(ài)該類(lèi)電影的職業(yè)是:’ + job[0] + ‘\n’ + ‘第二喜愛(ài)該類(lèi)電影的職業(yè)是:’ + job[1] + ‘\n’ + ‘第三喜愛(ài)該類(lèi)電影的職業(yè)是:’ + job[2] + ‘\n’)
item_class = load_class_data()
user_job = load_job()
data = load_data()
user_rate = user_cf_data(data)
id_input = int(input(‘enter movie class id :’))
id_list = class_id(item_class,id_input)
total_favorite = total_favorite_job(user_rate, user_job)
single_favorite = single_favorite_job(user_rate, id_list, user_job)
percent_favorite = cala_percent(single_favorite,total_favorite)
print_favorite_job(percent_favorite)`
第二模塊:
輸入職業(yè)號(hào)顯示喜愛(ài)的電影種類(lèi)前三位:
import numpy as np
import math
def load_data():
data = []
f = open(‘ml-100k/u.data’)
for i in range(100000):
h = f.readline().split(’\t’)
h = list(map(int, h))
data.append(h[0:3])
f.close()
return data
def load_class_data():
id_and_class = []
f = open(‘ml-100k/u.item’,encoding=‘ISO-8859-1’)
for i in range(1682):
h = f.readline().split(’|’)
id_and_class.append([int(h[0])])
h = list(map(int,h[5:]))
id_and_class[i].append(h)
f.close()
return id_and_class
def user_cf_data(data):
rate = []
for i in range(943):
rate.append([])
for j in range(1682):
rate[i].append(0)
for h in data:
rate[h[0] - 1][h[1] - 1] = h[2]
return rate
def load_job():
user_job = []
f = open(‘ml-100k/u.user’)
for i in range(943):
h = f.readline().split(’|’)
user_job.append([int(h[0])])
user_job[i].append(h[3])
f.close()
return user_job
def user_id(user_job, num):
id_list = []
job = []
f = open(‘ml-100k/u.occupation’)
for i in range(21):
h = f.readline().split(’\n’)
job.append(h[0])
f.close()
for i in range(943):
if user_job[i][1] == job[num]:
id_list.append(user_job[i][0])
return id_list
def calafavo(data, id_list, item_class):
n = len(id_list)
total_favorite = 0
list_favorite = []
percent = []
for i in range(19):
list_favorite.append(0)
for i in range(n):
for j in range(1682):
if data[id_list[i]-1][j] == 5:
total_favorite += 1
if item_class[id_list[i]-1][1][0] == 1:
list_favorite[0] += 1
elif item_class[id_list[i]-1][1][1] == 1:
list_favorite[1] += 1
elif item_class[id_list[i]-1][1][2] == 1:
list_favorite[2] += 1
elif item_class[id_list[i]-1][1][3] == 1:
list_favorite[3] += 1
elif item_class[id_list[i]-1][1][4] == 1:
list_favorite[4] += 1
elif item_class[id_list[i]-1][1][5] == 1:
list_favorite[5] += 1
elif item_class[id_list[i]-1][1][6] == 1:
list_favorite[6] += 1
elif item_class[id_list[i]-1][1][7] == 1:
list_favorite[7] += 1
elif item_class[id_list[i]-1][1][8] == 1:
list_favorite[8] += 1
elif item_class[id_list[i]-1][1][9] == 1:
list_favorite[9] += 1
elif item_class[id_list[i]-1][1][10] == 1:
list_favorite[10] += 1
elif item_class[id_list[i]-1][1][11] == 1:
list_favorite[11] += 1
elif item_class[id_list[i]-1][1][12] == 1:
list_favorite[12] += 1
elif item_class[id_list[i]-1][1][13] == 1:
list_favorite[13] += 1
elif item_class[id_list[i]-1][1][14] == 1:
list_favorite[14] += 1
elif item_class[id_list[i]-1][1][15] == 1:
list_favorite[15] += 1
elif item_class[id_list[i]-1][1][16] == 1:
list_favorite[16] += 1
elif item_class[id_list[i]-1][1][17] == 1:
list_favorite[17] += 1
elif item_class[id_list[i]-1][1][18] == 1:
list_favorite[18] += 1
for i in range(19):
percent.append(float(list_favorite[i])/float(total_favorite))
return percent
def print_favorite_class(percent_favorite):
f = open(‘ml-100k/u.genre’)
cla = []
for i in range(21):
h = f.readline().split(’|’)
cla.append(h[0])
f.close()
for i in range(19):
for j in range(18-i):
if percent_favorite[j] < percent_favorite[j+1]:
mid = percent_favorite[j]
percent_favorite[j] = percent_favorite[j+1]
percent_favorite[j+1] = mid
mid = cla[j]
cla[j] = cla[j+1]
cla[j+1] = mid
print(‘該職業(yè)最喜愛(ài)的電影種類(lèi)是:’ + cla[0] + ‘\n’ + ‘該職業(yè)第二喜愛(ài)的電影種類(lèi)是:’ + cla[1] + ‘\n’ + ‘該職業(yè)第三喜愛(ài)的電影種類(lèi)是:’ + cla[2] + ‘\n’)
data = load_data()
user_rate = user_cf_data(data)
item_class = load_class_data()
user_job = load_job()
job_list=[‘a(chǎn)dministrator’,‘a(chǎn)rtist’,‘doctor’,‘educator’,‘engineer’,‘entertainment’,‘executive’,‘healthcare’,‘homemaker’,‘lawyer’,
‘librarian’,‘marketing’,‘none’,‘other’,‘programmer’,‘retired’,‘salesman’,‘scientist’,‘student’,‘technician’,‘writer’]
for i in range(21):
print(’[’+str(i).rjust(2)+’]’+ job_list[i])
id_input = int(input(‘enter job id:’))
id_list = user_id(user_job, id_input)
percent = calafavo(user_rate, id_list, item_class)
print_favorite_class(percent)
第三模塊:
結(jié)合前兩種算法和推薦方法得出電影推薦結(jié)果:
1.自動(dòng)推薦平均評(píng)價(jià)在前十的電影:
2.輸入電影序號(hào)查看與其相似的電影以及喜歡該電影的用戶還喜歡哪些電影:
方法流程圖
2.2 與參照方法的對(duì)比
團(tuán)隊(duì)對(duì)于計(jì)算出與某部電影相近的其他電影所采用的方法是循環(huán)獲取用戶輸入,根據(jù)用戶輸入的電影ID,基于itemCF推薦算法,獲取十個(gè)相似電影,與基于皮爾遜相似計(jì)算得到的結(jié)果差異如下:
基于用戶推薦得到與某部電影相近的十部電影:
團(tuán)隊(duì)的方法得到與某部電影相近的十部電影:
總結(jié)
以上是生活随笔為你收集整理的数据挖掘-电影推荐系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL_经验碎片
- 下一篇: [恢]hdu 2012