賴麗君
(泉州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院信息技術(shù)系,福建泉州362000)
推薦系統(tǒng)通過分析海量信息來挖掘、 學(xué)習(xí)用戶的興趣或喜好,結(jié)合推薦技術(shù)及系統(tǒng)支撐框架,為每個用戶推薦其感興趣的產(chǎn)品或內(nèi)容。 目前解決“信息過載”的兩種重要的手段即是利用推薦系統(tǒng)與搜索引擎[1],兩者均能協(xié)助用戶獲取感興趣的內(nèi)容, 不同于搜索引擎, 推薦系統(tǒng)在進(jìn)行深度挖掘、分析用戶數(shù)據(jù),推測用戶興趣和喜好時是通過選用合適的推薦算法來進(jìn)行處理, 把用戶主動搜索的方式轉(zhuǎn)化為系統(tǒng)主動推送其感興趣的內(nèi)容或產(chǎn)品,為用戶提供智能化、個性化的推薦服務(wù)。
推薦系統(tǒng)目前已經(jīng)廣泛應(yīng)用于電影、 音樂、電子商務(wù)等網(wǎng)站中,并取得較好的推薦效果,推薦系統(tǒng)以往是基于Hadoop 框架下的MapReduce 的分布式計算平臺的,能解決海量數(shù)據(jù)的高效存儲和分布式計算問題, 但是隨著網(wǎng)絡(luò)和大數(shù)據(jù)技術(shù)的發(fā)展,對推薦系統(tǒng)的計算速度、實時性要求更高,而傳統(tǒng)的基于Hadoop 計算平臺不能滿足需要,Spark 框架以其計算速度快、 實時性強等特點, 逐漸取代MapReduce 成為目前熱門的推薦系統(tǒng)框架。
Apache Spark 是用于針對大規(guī)模數(shù)據(jù)處理的一種統(tǒng)一分析引擎[2]。 Spark 由Scala 語言實現(xiàn),支持Python、Java、Scala 等語言開發(fā), 可以和其他大數(shù)據(jù)工具如Hadoop、Kafka 等很好地整合。 Spark是基于內(nèi)存計算的,且具有易操作的特點,能夠快速、 簡潔、 高效的進(jìn)行并行化應(yīng)用的開發(fā)[3]。 與Hadoop 相比,Spark 因其數(shù)據(jù)結(jié)構(gòu)RDD 強大的計算能力, 對于處理數(shù)據(jù)挖掘與機器學(xué)習(xí)算法更加適合[4],能夠更高效地實現(xiàn)MapReduce 的操作。
基于協(xié)同過濾、內(nèi)容的推薦、混合推薦的這類的算法是傳統(tǒng)的推薦方法[5],在這三種算法中,當(dāng)前使用最為廣泛, 最為經(jīng)典的方法則是協(xié)同過濾算法, 如矩陣因子分解借助于用戶與項目或產(chǎn)品之間的交互信息,向用戶提供推薦內(nèi)容。 協(xié)同過濾算法目前有很多,主流的算法有兩種,分別是基于模型的協(xié)同過濾與基于鄰域的協(xié)同過濾。
基于鄰域的協(xié)同過濾算法在進(jìn)行推薦的過程中,通過對鄰域進(jìn)行搜索來計算相似度,主要相似度的計算為用戶之間的相似度與項目之間的相似度,它的實現(xiàn)相對簡單,但也存在過分依賴用戶的評分的缺點,特別是數(shù)據(jù)很稀疏時,推薦系統(tǒng)的預(yù)測精度將會急劇下降, 這將導(dǎo)致無法為新用戶進(jìn)行推薦的問題出現(xiàn)[6],基于模型的協(xié)同過濾算法在這種情況下, 它的預(yù)測速度將會更快且算法的可擴(kuò)展性更強, 有一種典型的代表就是使用最小二乘法(ALS)進(jìn)行矩陣分解算法。
ALS 同時考慮了用戶和物品兩個方面, 將用戶和物品的關(guān)系抽象為一個三元組<用戶, 物品,用戶對物品的評分>,并表示為一個評分矩陣,由于用戶不可能對所有物品進(jìn)行評分, 所以R 矩陣注定是一個稀疏矩陣,缺失不少評分。 為填充空值,ALS 算法采用“隱語義模型”,通過降維的方法來補全“用戶-物品”矩陣,并對沒有出現(xiàn)的值進(jìn)行估計[7],這使得稀疏矩陣的問題能得到有效地解決。在ALS 算法中, 首先假設(shè)有m 個用戶,n 個物品,用矩陣Rm×n來表示用戶對物品的評分, 即矩陣元素Rij代表評分值為第i 個用戶對第j 個物品的評分[8]。 Rm×n矩陣的規(guī)模通常很大,而且數(shù)據(jù)稀疏,為填充缺失值,ALS 算法假設(shè)評分矩陣是近似低秩的,將Rm×n分解為兩個子矩陣Xm×k(用戶對隱含特征的偏好矩陣),Yk×n(物品包含隱含特征的矩陣),使兩個矩陣相乘近似得到Rm×n,其中k<<min(m,n)即k 值遠(yuǎn)小于m 和n,這樣達(dá)到降維的目的,公式如下:
Rm×n≈Xm×kYTk×n
為了使得矩陣X 與矩陣Y 的乘積與原始矩陣R 值盡可能接近,ALS 采用最小化平方誤差損失函數(shù)方法,同時對損失函數(shù)加上正則化項后表示如下:
L(X,Y)=∑u,i(rui-xuTyi)2+λ(|xu|2+|yi|2)
其中λ 是正則化項系數(shù)。 xu作為用戶u 的隱含特征向量,yi是物品i 隱含的特征向量。 而rui則表示用戶u 對物品i 的評分。
具體求解步驟如下:
(1)將矩陣Y 進(jìn)行固定,再對xu求導(dǎo)[8],公式如下:
xu=(YTY+λI)-1YTru
(2)再固定矩陣X,然后對yi 求導(dǎo)[8],公式如下:
yi=(XTX+λI)-1XTri
在迭代過程中,隨機對X,Y 進(jìn)行初始化,交替對X、Y 進(jìn)行迭代優(yōu)化, 不斷更新X 和Y 的值,直至收斂。
本文基于Spark 生態(tài)框架及Mysql、IDEA、Node.js 等軟件平臺構(gòu)建電影推薦系統(tǒng)。 由HDFS分布式存儲結(jié)構(gòu)來對海量的歷史評分?jǐn)?shù)據(jù)進(jìn)行保存,為充分測試系統(tǒng)性能,使用的評分?jǐn)?shù)據(jù)源于網(wǎng)絡(luò),在使用之前在Pycharm 平臺進(jìn)行預(yù)處理后,在IDEA 平臺上進(jìn)一步清洗數(shù)據(jù),用戶在瀏覽網(wǎng)站時的行為及軌跡產(chǎn)生的實時數(shù)據(jù)由Spark Streaming處理,系統(tǒng)將用戶注冊信息、最新評分?jǐn)?shù)據(jù)、瀏覽歷史記錄等信息存儲到Mysql 數(shù)據(jù)庫中。 通過MLlib 平臺實現(xiàn)ALS 算法, 訓(xùn)練數(shù)據(jù)獲得最佳的推薦模型,產(chǎn)生推薦結(jié)果,向用戶推薦電影,同時對電影進(jìn)行點擊率、評分排名處理,設(shè)計基于電影排名推薦功能, 與ALS 算法一起形成組合推薦模式,向用戶推薦電影。 系統(tǒng)工作流程圖如圖1:
平樂古鎮(zhèn)對原有古鎮(zhèn)建筑進(jìn)行保留,并對當(dāng)?shù)鼐用襁M(jìn)行扶持,使其具有原始居民的人氣。利用已經(jīng)開發(fā)的建筑用地進(jìn)行經(jīng)營。不僅造福當(dāng)?shù)鼐用?,增加?dāng)?shù)鼐用竦氖杖?,而且利用?dāng)?shù)鼐用駥ㄖ涸黾由鷻C,營造古鎮(zhèn)氛圍吸引游客觀光及停留。在業(yè)態(tài)經(jīng)營上缺少多樣性和獨特性,在熙攘的人群中古鎮(zhèn)之景韻味有所欠缺。
圖1 系統(tǒng)總體設(shè)計
系統(tǒng)主要分為用戶信息,電影推薦,電影信息管理三個主要功能模塊,用戶信息模塊分為注冊、登錄、用戶信息管理功能,電影推薦模塊主要有個性化電影推薦功能、用戶評分功能,為解決ALS 算法存在的冷啟動問題, 在此模塊還增加熱門電影推薦功能和好劇推薦功能, 使系統(tǒng)在向老用戶推薦電影的同時, 也能為新用戶提供電影推薦,此外,為進(jìn)一步緩解冷啟動問題,在用戶注冊模塊增加年齡和對電影類別的偏好的信息填寫, 增加用戶特征屬性,對于新用戶進(jìn)行輔助推薦。系統(tǒng)功能模塊如圖2:
圖2 系統(tǒng)功能設(shè)計
在實驗室搭建Spark 生態(tài)環(huán)境, 安裝配置Kafka、Zookeeper、flume、MLlib、Spark SQL、Spark Streaming 等生態(tài)組件,搭建Hadoop 平臺,配置1個Master 節(jié)點和2 個work 節(jié)點,采用其HDFS 分布式存儲歷史評分?jǐn)?shù)據(jù), 對于實時產(chǎn)生的評分?jǐn)?shù)據(jù),將其存于MySQL 數(shù)據(jù)庫中。安裝IDEA 平臺采用Scala 編程語言開發(fā)程序, 安裝Node.js 進(jìn)行前端開發(fā)。 搭建Spark 環(huán)境部分效果如圖3。
3.4.1 算法實現(xiàn)
Spark 生態(tài)組件MLlib 是實現(xiàn)部分機器學(xué)習(xí)算法的平臺, 其中的spark.ml 包有提供實現(xiàn)交替最小二乘算法的函數(shù),在ALS 算法中,主要的實現(xiàn)過程如下幾個步驟:
(1)對數(shù)據(jù)集和Spark 生態(tài)環(huán)境進(jìn)行初始化操作, 通過語句(import org.apache.spark.mllib.recommendation.{ALS,ALSModel})來加載交替最小二乘ALS 算法模型。
(2)數(shù)據(jù)集轉(zhuǎn)換,將樣本評分?jǐn)?shù)據(jù)分為3 部分,訓(xùn)練數(shù)據(jù)占70%,將最靠近最近時間段的數(shù)據(jù)作為測試數(shù)據(jù)占20%(通過用戶評分表中的timestamp 排序獲?。?,校驗數(shù)據(jù)占10%。
(4)在對ALS 模型進(jìn)行訓(xùn)練的過程中,既進(jìn)行顯式反饋數(shù)據(jù)模型的訓(xùn)練, 同時也對隱式反饋數(shù)據(jù)進(jìn)行模型訓(xùn)練,通過調(diào)整參數(shù),多次迭代訓(xùn)練,產(chǎn)生最佳模型。
圖3 Spark 環(huán)境搭建
(5)通過模型預(yù)測評分,計算與實際評分間的均方根誤差RMSE,值越小越接近收斂。
(6)將推薦結(jié)果寫入數(shù)據(jù)庫,向用戶推薦電影。
3.4.2 功能實現(xiàn)
(1)用戶信息模塊。 實現(xiàn)了用戶注冊、登錄、用戶信息管理三個子功能模塊, 用戶注冊時盡可能簡化用戶操作,除了填寫基本信息外,需要選擇感興趣的電影種類,以便對新用戶進(jìn)行電影推薦。 用戶信息管理模塊用于管理用戶個人信息, 用戶可以對自己的信息進(jìn)行修改、完善,系統(tǒng)管理員也可查詢和管理網(wǎng)站所有用戶信息。 用戶注冊界面效果如圖4。
(2)電影推薦模塊。 這部分是網(wǎng)站的核心模塊,實現(xiàn)了個性化電影推薦、熱門電影推薦、好劇推薦、用戶評分等四個子功能模塊,用戶選擇對電影進(jìn)行星級評分,并發(fā)表評論,后臺管理員可以查看所有評分和評論并進(jìn)行管理, 網(wǎng)站實現(xiàn)對每個用戶提供個性化電影推薦服務(wù), 并組合近一個月內(nèi)點擊率高及評論數(shù)多的熱門電影, 和評分排名靠前的好劇進(jìn)行推薦。 部分效果如圖5、圖6、圖7所示。
圖4 用戶注冊界面
(3)電影信息管理模塊。 實現(xiàn)電影信息管理、電影分類管理子功能模塊, 便于網(wǎng)站管理員對電影信息進(jìn)行查詢、增加、修改、刪除等操作。
圖5 猜你喜歡
圖6 熱門電影推薦
圖7 電影評價
大數(shù)據(jù)環(huán)境下, 推薦系統(tǒng)已進(jìn)入到人們生活的各個方面, 為人們提供了更加豐富和便捷的體驗, 應(yīng)用前景廣泛。 本文設(shè)計并實現(xiàn)了一個基于Spark 生態(tài)環(huán)境的電影推薦系統(tǒng), 通過在Spark 框架中采用ALS 算法模型對數(shù)據(jù)進(jìn)行反復(fù)的訓(xùn)練、優(yōu)化調(diào)整,最終取得推薦的最佳模型,向用戶提供個性化電影推薦服務(wù)。 面對新用戶,推薦的挑戰(zhàn)主要是冷啟動問題,該系統(tǒng)以ALS 推薦算法為主,輔以熱門電影和優(yōu)質(zhì)好劇推薦,同時將電影分類,以用戶興趣為出發(fā)點,結(jié)合電影點擊率排名、評分排名向新用戶提供電影推薦服務(wù), 有效緩解冷啟動問題。