姜婷婷 杜振軍
(大連海事大學(xué) 大連 116026)
在2000年之前,人類共存儲(chǔ)了大約12EB的數(shù)據(jù),但是現(xiàn)在我們每天產(chǎn)生2EB的數(shù)據(jù)[1]。過去兩年的時(shí)間里產(chǎn)生了世界上百分之九十以上的數(shù)據(jù)[2]。數(shù)據(jù)量如此之大,如何將這些數(shù)據(jù)轉(zhuǎn)換成我們所需的信息,是現(xiàn)在急需解決的問題。
隨著信息技術(shù)的發(fā)展,網(wǎng)絡(luò)信息的選擇已經(jīng)成為人們最頭疼的事情之一,每當(dāng)人們?cè)诰W(wǎng)絡(luò)上購(gòu)物、聽音樂、看電視節(jié)目、買票看電影時(shí)都會(huì)糾結(jié)很久,因?yàn)槌尸F(xiàn)在我們眼前的選擇太多,無法從這么多的選擇中找到性價(jià)比高、適合自己的東西,而且在選擇的過程中會(huì)浪費(fèi)許多寶貴的時(shí)間。然而在這其中你會(huì)發(fā)現(xiàn)許多不同的客戶可能會(huì)選擇同樣的東西,或者同一名客戶可能會(huì)選擇類似的東西[3]。這就是本文研究的主要內(nèi)容,如何利用這兩點(diǎn)來提高預(yù)測(cè)的準(zhǔn)確度。
基于SVD矩陣分解模型的協(xié)同過濾算法因?yàn)槠溥\(yùn)算復(fù)雜度高,需要的存儲(chǔ)空間大,所以沒有得到很好的推廣[4];以往的算法和實(shí)驗(yàn)主要是在單機(jī)上進(jìn)行調(diào)試,隨著大數(shù)據(jù)時(shí)代的到來,推薦系統(tǒng)需要存儲(chǔ)的用戶數(shù)據(jù)和物品數(shù)據(jù)都在迅猛增長(zhǎng),使得在單機(jī)上實(shí)現(xiàn)這些算法變得非常慢[5],所以需要將這些算法進(jìn)行并行計(jì)算,從而提高算法的計(jì)算效率,加速推薦準(zhǔn)確度。
所以本文將在原有研究基礎(chǔ)上利用原有的grouplens網(wǎng)站(http://www.gouplens.org)的數(shù)據(jù),通過交替最小二乘法(Alternating Least Squares,ALS)模型在Spark平臺(tái)上的模型訓(xùn)練,得到在現(xiàn)有條件下最優(yōu)的模型參數(shù),同時(shí)將用該文中訓(xùn)練模型得出的結(jié)果與用均值預(yù)測(cè)模型得出的結(jié)果進(jìn)行比較,并且以用均值計(jì)算的結(jié)果為基準(zhǔn)計(jì)算本ALS模型性能提升了多少。
ALS是Alternating Least Squares的縮寫,意思為交替最小二乘法。該方法常用于矩陣分解的推薦系統(tǒng)中,它是統(tǒng)計(jì)分析中最常用的逼近計(jì)算的一種算法,其交替結(jié)果使得最終結(jié)果盡可能地逼近真實(shí)結(jié)果[6]。例如,將用戶(user)對(duì)商品的評(píng)分矩陣分解為兩個(gè)矩陣:一個(gè)為商品所包含的隱含特征矩陣,一個(gè)為用戶對(duì)商品隱含特征的偏好矩陣[7]。在這個(gè)矩陣分解的過程中,評(píng)分缺失項(xiàng)得到了補(bǔ)充,因此可以基于這個(gè)填充的評(píng)分給用戶做一下推薦,具體的算法理論如下:對(duì)于Zm*n矩陣,ALS主要是找到 2個(gè)低維矩陣Xm*k和 Yn*k,來逼近 Zm*n,即
其中Zm*n表示用戶對(duì)產(chǎn)品的偏好評(píng)分矩陣,Xm*k表示用戶對(duì)隱含特征的偏好矩陣,YTn*k表示產(chǎn)品所包含的隱含特征矩陣。通常取k<<min(m,n)也就是降維。為了使矩陣X和Y盡可能地接近于Z,需要最小化平方誤差損失函數(shù):
其中Xi表示用戶i的偏好隱含特征向量,Yj表示商品 j包含的隱含特征向量,Zi,j表示用戶 i對(duì)商品 j的偏好評(píng)分的近似,λ表示正則化項(xiàng)的系數(shù)。求解方法如下:
令 ?Z/?Xi=0,
其中Xi是Z的第i行,Yj是Z的第j列,E是k*k的單位矩陣。其迭代步驟是:首先初始化Y,利用式(3)更新得到X,然后利用式(4),更新Y,直到RMSE(均方根誤差)變化很小或者達(dá)到最大的迭代次數(shù)為止,均方根誤差公式:
ALS算法功能強(qiáng)大,效果理想而且被證明相對(duì)容易并行化。這使得它很適合Spark這樣的平臺(tái)[8]。
Spark Apach是一個(gè)分布式計(jì)算框架,在各類基于機(jī)器學(xué)習(xí)的和迭代分析的大規(guī)模數(shù)據(jù)處理任務(wù)上有廣泛的應(yīng)用[9]。同時(shí)它也是一個(gè)簡(jiǎn)單的大數(shù)據(jù)處理框架,基于MapReduce并行算法實(shí)現(xiàn)的分布式計(jì)算,對(duì)數(shù)據(jù)分析細(xì)致準(zhǔn)確[10]。Spark的優(yōu)點(diǎn)有很多,最主要的有以下幾個(gè)方面。首先,速度快。上文說到Spark是一個(gè)高效的分布式計(jì)算平臺(tái),不同于需要過多的文件讀取操作的Mapreduce,Spark是基于內(nèi)存的迭代計(jì)算框架,將中間結(jié)果存放在內(nèi)存中,不必每次都需要讀寫磁盤[11];其次,Spark方便易用。Spark提供了80多個(gè)高級(jí)API,接口豐富,可以使用戶快捷地建立自己的并行程序,而且Spark提供對(duì)java、scala、python、R四種語言的支持,根據(jù)需要選擇編程語言[12];再其次,Spark是一個(gè)處理大數(shù)據(jù)的通用引擎,將SQL交互查詢、流式處理、圖處理、機(jī)器學(xué)習(xí)等無縫結(jié)合,可用于多種應(yīng)用場(chǎng)景,完成多種運(yùn)算模式。用戶不必再采用不同的引擎來處理不同的需求。最后,Spark有多種運(yùn)算模式,Spark可部署為單機(jī)模式,也可部署在hadoop Yarn或者Apache Mesos集群上[13]。
程序采用IntelliJIDEA集成開發(fā)環(huán)境完成。從grouplens網(wǎng)站(http://www.gouplens.org)下載10MB大小的數(shù)據(jù)集作為本文的數(shù)據(jù)源,其中數(shù)據(jù)包含了71567個(gè)用戶對(duì)10681部電影的評(píng)分,共10000054條記錄[14]。利用這些用戶已經(jīng)做出的評(píng)價(jià)來訓(xùn)練我們的模型,最后通過比較平均方差MSE,均方根誤差RMSE和平均絕對(duì)誤差MAE的值來查看我們的模型是否達(dá)到提高預(yù)測(cè)準(zhǔn)確度的目的[15]。
其中將rating數(shù)據(jù)分成3部分(基于時(shí)間戳的最后一位):train(占60%),validation(20%)和test(占20%)三個(gè)數(shù)據(jù)集。Train數(shù)據(jù)集用于訓(xùn)練ALS模型,validation數(shù)據(jù)用于驗(yàn)證模型,得出ALS模型的最優(yōu)參數(shù)。在得出模型的最優(yōu)參數(shù)后,用test數(shù)據(jù)集做最后的測(cè)試。從而得到我們需要的最優(yōu)參數(shù)。
一開始,設(shè)rank為20迭代次數(shù)為5(rank和迭代次數(shù)越大,效果越好,為了節(jié)省計(jì)算資源,我們先取一個(gè)合適的rank值和一個(gè)較小的迭代次數(shù):正則參數(shù)分別取(0.01,0.1,1,10)。在對(duì)每組參數(shù)用train數(shù)據(jù)訓(xùn)練模型后,用validation數(shù)據(jù)計(jì)算均方差MSE、均方根誤差RMSE和平均絕對(duì)誤差MAE。實(shí)驗(yàn)數(shù)據(jù)如表1和圖1所示。
表1 固定rank和迭代次數(shù)的值
圖1 固定rank和迭代次數(shù)的值
通過上面的結(jié)果,可判斷:在rank值取固定值20,迭代次數(shù)取5的時(shí)候,正則參數(shù)lambda取0.1效果最好,下面固定rank=20和lambda=0.1,逐步加大迭代次數(shù)為10,15,20,25,30。實(shí)驗(yàn)結(jié)果如表2和圖2。
表2 固定rank和正則參數(shù)的值
圖2 固定rank和正則參數(shù)的值
通過上面的結(jié)果,在固定rank值為20,正則參數(shù)為0.1的時(shí)候,迭代次數(shù)達(dá)到20~25時(shí)就已經(jīng)很好,故迭代次數(shù)取20。下面固定迭代次數(shù)20和lambda=0.1,加大rank值。當(dāng)rank值為50的時(shí)候,MSE=0.6633,RMSE=0.8144,MAE=0.6365,和 rank為20時(shí)相比,幾乎無改善,故rank取20。所以目前得到的最優(yōu)參數(shù)為20,20,0.1,該模型計(jì)算出的MSE=0.6640,RMSE=0.8147,MAE=0.6364?,F(xiàn)在再固定rank=20,在0.1附近尋找最優(yōu)的正則參數(shù)lambda。實(shí)驗(yàn)結(jié)果表3和圖3。
表3 固定rank和迭代次數(shù)的值
圖3 固定rank和迭代次數(shù)的值
當(dāng)lambda=1和lambda=0.1時(shí),相比lambda=1時(shí),值明顯惡化。當(dāng)lambda=0.1/2時(shí),與lambda為0.1時(shí)更優(yōu)。當(dāng)lambda=0.05和0.1的中值時(shí),和lambda為0.05時(shí)對(duì)比,RMSE基本沒變,但MAE略微升高;當(dāng)lambda=0.05和0.01的中值,和lambda為0.05時(shí)對(duì)比,惡化;當(dāng)lambda=0.05和0.03的中值時(shí),和lambda為0.05時(shí)對(duì)比,惡化;當(dāng)lambda=0.05和0.075的大約中值0.06,和lambda為0.05時(shí)對(duì)比,更好;當(dāng)取0.065時(shí),與0.06時(shí)相比RMSE基本沒變,但MAE略微惡化;當(dāng)取0.055時(shí),和0.06相比,稍有惡化。所以,最優(yōu)lambda值為0.06,得出最優(yōu)ALS模型(20,20,0.06)。最后用test數(shù)據(jù)集測(cè)試最有模型(20,20,0.06)的效果,實(shí)驗(yàn)效果和validation數(shù)據(jù)集上實(shí)驗(yàn)效果一致,MSE=0.6450,RMSE=0.8031,MAE=0.6222。
最后,將ALS模型和均值模型做對(duì)比(在test數(shù)據(jù)集上計(jì)算誤差),RMSE改善了24.22%,MAE改善了27.26%。從而證明我們訓(xùn)練的模型的參數(shù)得出的預(yù)測(cè)值準(zhǔn)確度提升了。
本文主要將ALS模型與Spark平臺(tái)相結(jié)合,通過訓(xùn)練模型參數(shù)得到最優(yōu)的ALS模型。進(jìn)而證明用最優(yōu)參數(shù)ALS模型得到的值比用平均值更加接近真實(shí)值。最優(yōu)的ALS模型可以提高同一用戶對(duì)相似物品影片以及相似用戶對(duì)同一影片的評(píng)分的估計(jì)值[16]。
本論文的研究?jī)?nèi)容還有待改進(jìn)與進(jìn)一步研究的地方,結(jié)合本論文內(nèi)容與目前研究情況,下一步工作可以從以下幾個(gè)方面展開:目前研究的課題只適用于實(shí)驗(yàn)室的內(nèi)部環(huán)境,并且采用原有的數(shù)據(jù)集,下一步應(yīng)該擴(kuò)展研究,使其應(yīng)用于真實(shí)的環(huán)境中;論文中所采用的算法都是最基本的算法問題,下一步的研究可以考慮對(duì)算法做出改進(jìn),繼續(xù)加深對(duì)最優(yōu)ALS模型的研究,將預(yù)測(cè)評(píng)分的準(zhǔn)確度進(jìn)一步提高,并對(duì)相關(guān)用戶做出推薦[17];Spark平臺(tái)適用于多種應(yīng)用場(chǎng)景,基于其各模塊間無縫連接,下一步可以考慮結(jié)合更多模塊,根據(jù)需求實(shí)現(xiàn)新的應(yīng)用研究等。