movielens電影推薦

現(xiàn)在幾種主流的推薦引擎技術(shù)包括:
近鄰算法推薦引擎:基于用戶的協(xié)同過濾和基于項(xiàng)目的協(xié)同過濾;
個(gè)性化推薦引擎:基于內(nèi)容的推薦引擎和情境感知推薦引擎;
基于模型的推薦引擎:基于機(jī)器學(xué)習(xí)的推薦引擎、分類模型-SVM/KNN、矩陣分解、奇異值分解、交替最小二乘法概述、混合推薦引擎。

基于近鄰算法的推薦系統(tǒng)認(rèn)為相同或相似用戶的喜好相近,使用這種方式對活躍用戶進(jìn)行推薦。這種基于近鄰算法的推薦思想設(shè)定是非常簡單的:根據(jù)某一個(gè)給定的用戶評級(jí),尋找所有相似用戶的歷史喜好信息,根據(jù)這些活躍用戶的歷史信息對所有未知產(chǎn)品做出預(yù)測,對沒有評級(jí)過該商品的用戶根據(jù)近鄰原則進(jìn)行推薦猜測。

這一方法是基于以下假設(shè):
1、在過去有相似偏好的人在未來也有相似的偏好
2、人們的偏好在未來的時(shí)間里將保持穩(wěn)定和一致。

協(xié)同過濾系統(tǒng)有兩種類型:
1、基于用戶的協(xié)同過濾
2、基于項(xiàng)目的協(xié)同過濾

基于用戶的協(xié)同過濾系統(tǒng)的基本判斷思想是過去具有相似口味的人,在將來也會(huì)喜歡類似的物品。例如,如果用戶A和用戶B有非常相似的購物歷史,當(dāng)用戶A購買了一本用戶B還沒有看過的新書,就可以將這本新書推薦給用戶B,因?yàn)樗麄冇邢嗨频钠肺丁?/p>

基于項(xiàng)目的協(xié)同過濾推薦系統(tǒng)與基于用戶的協(xié)同過濾不同,它使用項(xiàng)目之間的相似度而不是用戶之間的相似度。

近鄰算法只有當(dāng)有用戶的商品交互信息時(shí)才能工作,比如評級(jí)、喜歡/不喜歡、看過/沒看過等。與基于內(nèi)容的推薦不同,它不考慮任何產(chǎn)品特征或用戶對產(chǎn)品的個(gè)人偏好信息。

臨近算法有它自身的弱點(diǎn)和局限性,比如對已有數(shù)據(jù)過于依賴造成的冷啟動(dòng)問題,即它們無法實(shí)現(xiàn)向新用戶 ( 指未對商品等進(jìn)行過任何評價(jià)的用戶 ) 進(jìn)行商品推薦,也無法向用戶推薦沒有評級(jí)的新商品。當(dāng)用戶對產(chǎn)品的評級(jí)很少時(shí),這些推薦系統(tǒng)無法處理這類數(shù)據(jù)十分稀疏的情形。

協(xié)同過濾算法
協(xié)同過濾算法是一種較為著名和常用的推薦算法,它基于對用戶歷史行為數(shù)據(jù)的挖掘發(fā)現(xiàn)用戶的喜好偏向,并預(yù)測用戶可能喜好的產(chǎn)品進(jìn)行推薦。也就是常見的“猜你喜歡”,和“購買了該商品的人也喜歡”等功能。它的主要實(shí)現(xiàn)由:
●根據(jù)和你有共同喜好的人給你推薦
●根據(jù)你喜歡的物品給你推薦相似物品
●根據(jù)以上條件綜合推薦
因此可以得出常用的協(xié)同過濾算法分為兩種,基于用戶的協(xié)同過濾算法(user-based collaboratIve filtering),以及基于物品的協(xié)同過濾算法(item-based collaborative filtering)。特點(diǎn)可以概括為“人以類聚,物以群分”,并據(jù)此進(jìn)行預(yù)測和推薦。

后來出現(xiàn)了基于內(nèi)容的推薦系統(tǒng)。基于內(nèi)容的推薦系統(tǒng)是根據(jù)用戶的之前的偏好,計(jì)算推薦項(xiàng)目中與用戶偏好相似度最高的項(xiàng)目,推薦給用戶。

基于內(nèi)容的推薦系統(tǒng)解決了很多協(xié)同過濾中的缺點(diǎn),但其自身也有固有的缺點(diǎn),比如新發(fā)現(xiàn),換句話說,就是不能在用戶的偏好范圍之外進(jìn)行新項(xiàng)目的推薦,但這個(gè)問題協(xié)同過濾卻可以解決。

以下是基于用戶的協(xié)同過濾的電影推薦:

需滿足的條件:
1、一個(gè)與該應(yīng)用有過互動(dòng)的用戶集合
2、一個(gè)所有可用電影的目錄
3、每位用戶對電影的評級(jí)

不是所有的用戶對所有電影都進(jìn)行了評級(jí),但是未評級(jí)的電影作品只占少數(shù)。

一、數(shù)據(jù)整理

讀入我們所需的數(shù)據(jù)

data = {}
file = open("data.csv", 'r',encoding='UTF-8')
for line in file.readlines():
    line = line.strip().split(',')
    if not line[0] in data.keys():
        data[line[0]] = {line[3]: line[1]}
    else:
        data[line[0]][line[3]] = line[1]

選取數(shù)據(jù)文件data中的用戶“1”作為此次電影推薦的目標(biāo)用戶

user1_data = data['1']#“1”的電影和評分

二、用戶相似度計(jì)算

為目標(biāo)用戶找到相似的用戶,然后向目標(biāo)用戶推薦其還沒有看過但是與其相似用戶已經(jīng)看過的電影。

利用電影評級(jí)信息計(jì)算用戶之間的相似度。

res = []#用于記錄目標(biāo)用戶與其他用戶的相似度數(shù)據(jù)
for userid in data.keys():#計(jì)算“1”與其他用戶相似度
    if not userid == '1':#要排除“1”的數(shù)據(jù)
        user1_data = data['1']#“1”的電影和評分
        user2_data = data[userid]#其他用戶的電影和評分
        distance = 0
        for key in user1_data.keys():#計(jì)算歐式距離
            if key in user2_data.keys():
                distance += pow(float(user1_data[key]) - float(user2_data[key]), 2)
        simliar = 1 / (1 + sqrt(distance))#simliar值越小,相似度越大

:由于我們選取了data數(shù)據(jù)集中的用戶“1”作為目標(biāo)用戶,因此這里需把目標(biāo)用戶從其他用戶中排除。

用戶之間的相似度可以通過用戶給定的電影評級(jí)進(jìn)行計(jì)算。計(jì)算相似度最常用的方法有歐氏距離與皮爾遜相關(guān)系數(shù)。

在此處采用歐氏距離來計(jì)算用戶相似度。利用如下公式:

找到與目標(biāo)用戶相似度最高的用戶

        res.append((userid, simliar))#記錄目標(biāo)用戶與其他用戶的相似度數(shù)據(jù)
res.sort(key=lambda val: val[1])#將res內(nèi)的數(shù)據(jù)按照相似度從小到大進(jìn)行排序
print(res)

三、推薦電影

根據(jù)上面所計(jì)算的用戶相似度找到與目標(biāo)用戶相似度最高的用戶。
從相似度最高的用戶的觀影記錄中篩選出目標(biāo)用戶未觀看的電影并添加到列表中,按照評分排序找到評分最高的10部電影。

#根據(jù)相似度來推薦用戶
top_sim_user = res[0][0]
items = data[top_sim_user]# 相似度最高的用戶的觀影記錄
recommendations = []
for item in items.keys():# 篩選出該用戶未觀看的電影并添加到列表中
    if item not in data['1'].keys():
        recommendations.append((item, items[item]))
recommendations.sort(key=lambda val: val[1], reverse=True)  # 按照評分排序
print(recommendations[:10])# 返回評分最高的10部電影

最后,可以得到結(jié)果:

四、總結(jié)

臨近算法有它自身的弱點(diǎn)和局限性,比如對已有數(shù)據(jù)過于依賴造成的冷啟動(dòng)問題,即它們無法實(shí)現(xiàn)向新用戶 ( 指未對商品等進(jìn)行過任何評價(jià)的用戶 ) 進(jìn)行商品推薦,也無法向用戶推薦沒有評級(jí)的新商品。當(dāng)用戶對產(chǎn)品的評級(jí)很少時(shí),這些推薦系統(tǒng)無法處理這類數(shù)據(jù)十分稀疏的情形。
基于內(nèi)容的推薦系統(tǒng)解決了很多協(xié)同過濾中的缺點(diǎn),但其自身也有固有的缺點(diǎn),比如新發(fā)現(xiàn),換句話說,就是不能在用戶的偏好范圍之外進(jìn)行新項(xiàng)目的推薦,但這個(gè)問題協(xié)同過濾卻可以解決。
在實(shí)際應(yīng)用中推薦混合推薦模型,這種模型比任一單個(gè)模型都更加強(qiáng)大。

代碼文件:https://gitee.com/youngyr/Python/tree/master/%E5%90%B4%E6%81%A9%E8%BE%BE%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容