数据挖掘-电影推荐系统
背景
隨著Internet的日漸普及,人們對于看電影的需求不單單只是到電影院購買一張電影票這么簡單了。手機、電腦上各種觀影軟件填補了許多人對于電影的渴望,但是如何能夠在視頻軟件中快速、準確地定位到用戶喜歡什么電影這種看不見摸不著的想法,成為了開發者一直探討的問題。電影推薦系統在此種情景下應運而生,2006年Netflix的百萬美金大賽將此類技術推向高潮,在那之后的十余年間,各種電影推薦算法層出不窮,對于用戶的喜好判斷也越來越精準。本次大作業是基于不同類型的電影受不同職業人群的歡迎程度來做的電影推薦,以平均評價為一項指標來推薦用戶想要的電影。
技術路線
1.1已有相關技術介紹
已有的實現電影推薦的代碼主要使用了以下技術:
一、 基于用戶的協同過濾(User Collaborative Filtering,簡稱 UserCF)通過用戶對不同內容(物品)的行為,來評測用戶之間的相似性,找到“鄰居”基于這種相似性做出推薦。
二、 基于物品的協同過濾(Item Collaboration Filter,簡 稱ItemCF)算法給用戶推薦那些和他們之前喜歡的物品相似的物品。
1.2團隊使用相關技術介紹
一、團隊設計新的電影推薦系統時設計思路如下:
1.將電影信息及觀影用戶相關聯
電影的種類和風格以及其他詳細參數,會影響到觀影人數,以及觀影人數的評分,考慮電影本身和電影的受眾,有助于提高電影推薦的準確度。
2.分析觀影用戶的相關信息
對于不同電影的觀影人數以及觀影人數的評分進行統計。
3.統計電影評分TOP N
電影的評分是用戶對未知電影的數據參考,這一數據將從極大程度上影響用戶對電影的選擇。
二、團隊在已有技術基礎上設計新的電影推薦系統時使用了以下算法與技術:
1.surprise的使用
● 在推薦系統的建模過程中,我們將用到python庫 Surprise(Simple Python Recommendation System Engine),是scikit系列中的一個。
● 簡單易用,同時支持多種推薦算法:
? 基礎算法/baseline algorithms
? 基于近鄰方法(協同過濾)/neighborhood methods
? 矩陣分解方法/matrix factorization-based (SVD, PMF, SVD++, NMF)
2.協同過濾
兩種協同過濾算法及其適用場景:
UserCF更適合對新穎性要求高的場景,比如新聞推薦,很少有用戶只看某個話題的新聞,主要是因為這個話題不可能保證每天都有新的消息,而這個用戶卻是每天都要看新聞的。
ItemCF更適合用戶興趣穩定的場景,如購書、音樂和電影推薦。在這些場景中,用戶的興趣是比較固定和持久的,這些網站中個性化推薦的任務是幫助用戶發現和其興趣領域相關的物品。
二、結果展示
2.1 數值結果展示
第一模塊:
輸入電影類別號顯示喜愛該類電影的職業前三位:
`import numpy as np
import math
#讀取u.data數據
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類別數據
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工作數據
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數據,制成user-item評分表
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
#獲取所選種類電影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
#獲取各個職業對該種類電影滿分評價次數
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] == ‘administrator’:
list_favrite[0] += 1
elif user_job[j][1] == ‘artist’:
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
#獲取各個職業對所有電影滿分評價次數
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] == ‘administrator’:
list_favrite[0] += 1
elif user_job[j][1] == ‘artist’:
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
#計算各個職業對該類電影滿分評價占對所有電影滿分評價百分比
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
#排序并輸出結果
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(‘最喜愛該類電影的職業是:’ + job[0] + ‘\n’ + ‘第二喜愛該類電影的職業是:’ + job[1] + ‘\n’ + ‘第三喜愛該類電影的職業是:’ + 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)`
第二模塊:
輸入職業號顯示喜愛的電影種類前三位:
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(‘該職業最喜愛的電影種類是:’ + cla[0] + ‘\n’ + ‘該職業第二喜愛的電影種類是:’ + cla[1] + ‘\n’ + ‘該職業第三喜愛的電影種類是:’ + cla[2] + ‘\n’)
data = load_data()
user_rate = user_cf_data(data)
item_class = load_class_data()
user_job = load_job()
job_list=[‘administrator’,‘artist’,‘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)
第三模塊:
結合前兩種算法和推薦方法得出電影推薦結果:
1.自動推薦平均評價在前十的電影:
2.輸入電影序號查看與其相似的電影以及喜歡該電影的用戶還喜歡哪些電影:
方法流程圖
2.2 與參照方法的對比
團隊對于計算出與某部電影相近的其他電影所采用的方法是循環獲取用戶輸入,根據用戶輸入的電影ID,基于itemCF推薦算法,獲取十個相似電影,與基于皮爾遜相似計算得到的結果差異如下:
基于用戶推薦得到與某部電影相近的十部電影:
團隊的方法得到與某部電影相近的十部電影:
總結
以上是生活随笔為你收集整理的数据挖掘-电影推荐系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL_经验碎片
- 下一篇: 分享制作精良的知识管理系统 配置SQL