張玉葉
摘要:隨著在線電影數量的飛速增長,要想從眾多的電影中選擇一部自己想看的電影變得越來越困難。為了更好地滿足用戶的觀影需求,電影推薦系統應運而生,它通過用戶的觀影記錄來發現用戶的興趣,從而幫助用戶在眾多電影中篩選到自己感興趣的電影。基于物品的協同過濾算法是電影推薦系統中最常用的推薦算法,該算法的關鍵是計算物品的相似度及推薦評分,相似度矩陣是一稀疏矩陣,已有的一些電影推薦系統中通常采用二維數組來存放相似度矩陣,利用第三方擴展庫Numpy來計算推薦評分,時間空間效率相對較低,該文利用Python內置的序列字典來存放稀疏矩陣,自行編寫相應的代碼來求解相似度和推薦評分,可有效提高算法的時間、空間效率。
關鍵詞:推薦系統;協同過濾;Python;稀疏矩陣
中圖分類號:TP391.1 文獻標識碼:A 文章編號:1009-3044(2019)06-0070-04
Design and Implementation of Movie Recommendation System Based on Collaborative Filtering
ZHANG Yu-ye
(Dept. of computer, Jinan Vocational College, Jinan 250014, China)
Abstract: With the rapid increase in the number of online movies, it is increasingly difficult to choose from among the many movies you want to watch. In order to better meet the user's viewing needs, the film recommendation system came into being. It discovered the user's interest through the user's viewing video record, thus helping users to select movies of interest in many movies. The object-based collaborative filtering algorithm is the most commonly used recommendation algorithm in the movie recommendation system. The key of the algorithm is to calculate the similarity of the item and the recommended score. The similarity matrix is a sparse matrix. Some existing movie recommendation systems usually use two-dimensional arrays to store similarity matrices, use third-party extension library Numpy to calculate the recommended score, which leads to the low efficiency of time and space. This article uses Python's built-in sequence dictionary to store sparse matrices and gives the corresponding code to solve the recommended score, which improves the algorithm efficiency of time and space.
Key words: recommender system; collaborative filtering; Python; sparse matrix
1 背景
隨著在線電影數量的飛速增長,要想從眾多的電影中選擇一部自己想看的電影變得越來越困難。當用戶有明確觀影需求時可利用搜索引擎來查找自己想看的電影,但當用戶沒有明確需求時,就很難利用搜索引擎來查找自己想看的電影,此時電影推薦系統應運而生,它通過用戶的觀影記錄來發現用戶的興趣,從而幫助用戶在眾多電影中篩選到自己感興趣的電影。基于物品的協同過濾算法是電影推薦系統中最常用的推薦算法,該算法的關鍵是計算電影的相似度及推薦評分,在計算時需要用到矩陣的一些運算,Python的第三方擴展庫Numpy提供了大量的數組及矩陣運算,因此已有的一些電影推薦系統中多是利用Numpy來實現協同過濾算法,但因協同過濾算法中涉及到的矩陣多是稀疏矩陣,采用普通的二維數組存放存在大量的無效存儲,空間利用率較低,同時利用Numpy擴展庫也無法進行算法的優化,因此本文利用Python的內置序列字典來存放稀疏矩陣,自行編制相應的代碼來求解相似度及推薦評分,可有效提高算法的時間空間效率。
2 推薦系統
推薦系統是建立在海量數據挖掘基礎上的,它通過分析用戶的歷史數據來了解用戶的需求和興趣,從而將用戶感興趣的信息、物品等主動推薦給用戶,其本質是建立用戶與物品之間的聯系。一個完整的推薦系統通常包含3個模塊:用戶建模模塊、推薦對象建模模塊和推薦算法模塊。推薦系統首先對用戶進行建模,根據用戶行為數據和屬性數據來分析用戶的興趣和需求,同時也對推薦對象進行建模。接著,基于用戶特征和物品對象特征,采用推薦算法計算得到用戶可能感興趣的物品,然后根據推薦場景對推薦結果進行一定的推薦和調整,最終將推薦結果展示給用戶[1]。
3 協同過濾算法
協同過濾算法分為基于用戶的協同過濾算法和基于物品的協同過濾算法[2]。
基于用戶的協同過濾算法(簡稱UserCF),通過不同用戶對物品的評分來評測用戶之間的相似性,基于用戶之間的相似性做出推薦。簡單來講就是:給用戶推薦和他興趣相似的其他用戶喜歡的物品。
基于物品的協同過濾算法(簡稱ItemCF),通過用戶對不同物品的評分來評測物品之間的相似性,基于物品之間的相似性做出推薦。簡單來講就是:給用戶推薦和他之前喜歡的物品相似的物品。
UserCF算法和ItemCF算法思想類似,其實現過程也基本類似,唯一不同的是一個是計算用戶相似度,一個是計算物品相似度。
UserCF算法和ItemCF最主要的區別在于:UserCF推薦的是那些和目標用戶有共同興趣愛好的其他用戶所喜歡的物品,ItemCF算法則推薦那些和目標用戶之前喜歡的物品類似的其他物品。因此,UserCF算法的推薦更偏向社會化,適合應用于新聞推薦、微博話題推薦等應用場景;而ItemCF算法的推薦則是更偏向于個性化,適合應用于電子商務、電影、圖書等應用場景。
4 電影推薦系統的設計與實現
4.1 推薦算法
根據前面對協同過濾算法的分析,電影推薦系統適合采用基于物品的協同過濾算法(簡稱ItemCF)。基于物品的協同過濾算法是給目標用戶推薦那些和他們之前喜歡的物品相似的物品。此算法并不利用物品的內容屬性計算物品之間的相似度,而主要通過分析用戶的行為記錄來計算物品之間的相似度。ItemCF算法主要包括兩步:
4.5計算推薦評分及推薦結果
計算每個用戶的未曾看過的電影的推薦評分(也即興趣度)。推薦評分=同現矩陣M*評分向量R。
評分向量即用戶對所有物品(電影)的評分,由評分記錄表可得出。
4.6 輸出推薦結果
推薦結果的輸出可根據需要自由構造,既可以只生成某一指定用戶的推薦列表,也可生成所有用戶的推薦列表,如要生成對所有用戶推薦1部未曾看過的電影,其對應的代碼為:
5 測試分析
前面給出的測試數據集數據很少,主要應用于系統開發測試中。實際應用中推薦系統所用的數據集通常為海量數據,為驗證系統在海量數據中的使用,可以MovieLens(http://grouplens.org/datasets/movielens)作為電影推薦系統中的實驗數據來測試系統。MovieLens是GroupLens Research實驗室的一個非商業性質、以研究為目的的實驗性項目,采集了一組從20世紀90年代末到21世紀初的電影評分數據,包含大小不同的數據集,每個數據集中包括電影信息數據及電影評分記錄等。如MovieLens 1M數據集中存放了1000多名用戶對近2000部電影的評分記錄,每個用戶至少對20部電影進行過評分,一共有100000多條電影評分記錄,能夠模擬出海量數據的推薦。如采用MovieLens 1M數據集來使用本系統來為用戶1推薦5部想看的電影,其推薦結果如圖7所示。
6 結束語
電影推薦系統可幫助用戶從海量電影中獲取自己想看電影,是大數據在互聯網領域的典型應用,通過分析用戶的歷史觀影記錄來了解用戶的喜好,從而主動為用戶推薦其感興趣的電影,滿足了用戶的個性化觀影需求。該文利用Python語言實現的基于物品的協同過濾算法的電影推薦系統,利用了Python內置的序列字典來存放稀疏矩陣,自行編寫相應的代碼實現矩陣運算及求解推薦評分,相比于利用Numpy第三方擴展庫,其算法時間空間效率相對較高。
參考文獻:
[1] 查魯 C 阿加沃爾. 推薦系統:原理與實踐[M]. 北京: 機械工業出版社, 2017.
[2] 項亮. 推薦系統實踐[M]. 北京: 人民郵電出版社, 2012.
[3] 王建芳. 機器學習算法實踐[M]. 北京: 清華大學出版社, 2018.
[4] 董付國. Python程序設計開發寶典[M]. 北京: 清華大學出版社, 2017.
[5] 林子雨. 大數據技術原理與應用[M]. 北京: 人民郵電出版社, 2017.
【通聯編輯:謝媛媛】