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