鐘志攀,袁仕芳,梁榮鋒,朱翡虹
(五邑大學(xué) 數(shù)學(xué)與計(jì)算科學(xué)學(xué)院,廣東 江門 529020)
隨著互聯(lián)網(wǎng)的普及和信息技術(shù)的發(fā)展,人們?nèi)粘I羁梢越佑|到的信息越來越豐富,產(chǎn)生信息數(shù)據(jù)的速度也越來越快。但是“信息過載”問題也越來越嚴(yán)重。想要從這海量的信息中獲取目的信息需要耗費(fèi)大量的時(shí)間和精力。
人們解決“信息過載”問題的方法主要有建立搜索引擎、建立推薦系統(tǒng)(recommended system)[1-3]。推薦系統(tǒng)是比搜索引擎處理問題更為人性化的工具,它可以根據(jù)用戶的個(gè)人愛好、歷史瀏覽記錄等為用戶推薦所感興趣的內(nèi)容[4-6]。建立一個(gè)好的推薦系統(tǒng)可以節(jié)省用戶查找感興趣內(nèi)容的時(shí)間,增強(qiáng)用戶體驗(yàn),還可以提高商品銷售量。推薦系統(tǒng)在很多行業(yè)都有應(yīng)用,例如新聞行業(yè)中的《今日頭條》,個(gè)性音樂軟件“網(wǎng)易云音樂”,尤其是電商行業(yè),最著名的例子就有亞馬遜的“尿不濕和啤酒”[7]。推薦系統(tǒng)在工業(yè)上最經(jīng)典的應(yīng)用莫過于協(xié)同過濾算法(CF)[8-9],該算法通過找到與用戶有相同品味的用戶,然后將相似用戶過去喜歡的物品推薦給用戶。
文中首先介紹了奇異值分解(SVD)和SVD推薦算法之間的聯(lián)系,以及SVD推薦算法原理,在此基礎(chǔ)上,建立了一個(gè)傳統(tǒng)服飾商城的推薦系統(tǒng)。然后利用傳統(tǒng)服飾商城的用戶樣本數(shù)據(jù)測(cè)試該推薦系統(tǒng)的性能。
協(xié)同過濾算法是推薦系統(tǒng)中的經(jīng)典算法。協(xié)同過濾算法主要分為兩類,一類是基于鄰域(neighborhood methods)的協(xié)同過濾算法,另一類是隱語(yǔ)義模型(latent factor models)的協(xié)同過濾算法[10],后者是利用矩陣分解(matrix factorization)算法實(shí)現(xiàn)的。
為了評(píng)價(jià)推薦算法的性能,一般使用平方絕對(duì)值誤差(MAE)和均方根誤差(RMSE)測(cè)試推薦系統(tǒng)的準(zhǔn)確性,公式如下:
(1)
(2)
其中,Rtest表示測(cè)試數(shù)據(jù)集,ui表示用戶i,cj表示商品j,r(ui,cj)表示用戶ui對(duì)商品cj的評(píng)分。
SVD算法是在奇異值分解(singular value decomposition)[11]的基礎(chǔ)上建立起來的矩陣分解算法。對(duì)于矩陣A∈Rn×m,它的奇異值分解為:
(3)
其中,Σr=diag(λ1,λ2,…,λr),r=rank(A),U∈Rn×n和V∈Rm×m是正交矩陣。U的列向量稱為左奇異值向量;Σr對(duì)角線上的值是A非零奇異值;VT是V的轉(zhuǎn)置,V的列向量稱為右奇異向量。
通常定義奇異值為σi,在矩陣Σ中沿對(duì)角線從大到小排列為:
σ1≥σ2≥…≥σr,r≤min{n,m}
σi的下降速度很快,大多數(shù)情況下,前10%甚至1%的奇異值的和就可占所有奇異值之和的99%以上,所以這里r往往遠(yuǎn)小于n和m。根據(jù)奇異值的這個(gè)性質(zhì),可以用一部分奇異值近似地描述矩陣所包含的信息,即有:
(4)
其中k≤r。
傳統(tǒng)的推薦系統(tǒng)一般會(huì)通過用戶對(duì)商品進(jìn)行評(píng)價(jià),得出評(píng)分矩陣R(rating matrix),再通過評(píng)分矩陣進(jìn)行分類、預(yù)測(cè)用戶喜好,從而進(jìn)行商品推薦。當(dāng)用戶數(shù)量比較大,商品種類和數(shù)量比較多時(shí),很難做到讓所有的客戶對(duì)所有的商品進(jìn)行評(píng)分,此時(shí)評(píng)分矩陣R就會(huì)出現(xiàn)很多的缺失值。
這些缺失的評(píng)分可以看作是用戶ui對(duì)于商品cj的未知的潛在評(píng)分。SVD算法的思路就是在評(píng)分矩陣R缺失的情況下,對(duì)矩陣進(jìn)行分解,從而得到用戶因子矩陣U(users features matrix)和商品因子矩陣C(item features matrix),最后通過矩陣U和C來預(yù)測(cè)用戶對(duì)商品的潛在評(píng)分。
由式(6)推廣到分解評(píng)分矩陣R,有以下等式:
Un×r=Un×nΣr×r
(5)
(6)
用隱語(yǔ)義模型來進(jìn)行協(xié)同過濾的目標(biāo)是揭示隱藏的特征,這些隱藏的特征能夠解釋觀測(cè)到的評(píng)分。SVD是為了識(shí)別隱語(yǔ)義因子而發(fā)展起來的,然而由于大部分評(píng)分值缺失,把SVD應(yīng)用到CF領(lǐng)域的顯式評(píng)分變得相對(duì)困難。例如表1。
表1 評(píng)分矩陣R
實(shí)際情況中往往只能獲得形如表1所示的評(píng)分矩陣,所有用戶無(wú)法對(duì)所有商品進(jìn)行評(píng)價(jià),造成評(píng)分矩陣存在缺失值。當(dāng)r(i,j)=0,表示用戶i對(duì)商品j的評(píng)分缺失,如表1所示。存在缺失的現(xiàn)實(shí)意義就是用戶尚未購(gòu)買或者與某商品有一些交互動(dòng)作,因此,通過預(yù)測(cè)缺失的評(píng)分,在用戶尚未評(píng)價(jià)的商品中,通過用戶原有的評(píng)分記錄和其他用戶的相似性這一先驗(yàn)知識(shí),對(duì)用戶沒有評(píng)分的商品進(jìn)行評(píng)分預(yù)測(cè)。
SVD算法在奇異值分解的基礎(chǔ)上,將存在缺失值的評(píng)分矩陣R分解成形如表2和表3的用戶因子矩陣U和商品因子矩陣C。
表2 用戶因子矩陣U
表3 商品因子矩陣C
可以不用知道這兩個(gè)矩陣中的因子(factors)具體是什么,第一個(gè)因子可以是商品的價(jià)格,也可以是商品的外觀的美觀程度。關(guān)于“因子”,可以把它認(rèn)為是商品的子屬性。對(duì)同一個(gè)因子進(jìn)行評(píng)分,在用戶因子矩陣中表示用戶偏愛于這種商品的屬性的程度,而在商品因子矩陣中則表示此屬性在該商品反映的程度。
對(duì)于要推薦的商品,如衣服,價(jià)格是衣服的屬性之一,假設(shè)這件衣服的價(jià)格很低廉,那么相對(duì)應(yīng)評(píng)分就會(huì)高些,此時(shí)用戶在購(gòu)買衣服時(shí)十分注重衣服的價(jià)格,那么對(duì)于衣服的價(jià)格的偏愛程度就會(huì)高一點(diǎn)。
通過矩陣分解(可以是任何合理的矩陣分解算法),得到了上面的用戶因子矩陣U和商品因子矩陣C,通過分解出來的因子評(píng)分可以預(yù)測(cè)出用戶對(duì)新商品的評(píng)分,在這些新商品的評(píng)分中選取前n(Top-N)個(gè)預(yù)測(cè)評(píng)分最高的物品,構(gòu)造出推薦列表進(jìn)行推薦。
預(yù)測(cè)用戶ui對(duì)商品cj的評(píng)分,利用用戶因子矩陣U和商品因子矩陣C計(jì)算可得預(yù)測(cè)評(píng)分:
(7)
利用式(7)可以得到表4。
表4 評(píng)分矩陣
通過上述內(nèi)容,SVD算法實(shí)現(xiàn)推薦的主要思路是:通過矩陣分解技術(shù)將評(píng)分矩陣R分解成用戶因子矩陣U和商品因子矩陣C,再通過這兩個(gè)矩陣的合成從而預(yù)測(cè)用戶對(duì)商品的評(píng)分。但是矩陣U和C并不是直接通過矩陣分解得出,而是通過學(xué)習(xí)的方法得到。
預(yù)測(cè)用戶ui對(duì)商品cj的評(píng)分可以表示為:
(8)
(9)
其中I∈{0,1}n×m,作為一個(gè)指示器,指示相應(yīng)位置是否有評(píng)分,有評(píng)分為“1”,沒有評(píng)分為“0”,最后兩項(xiàng)是正則化項(xiàng);ku和kc是常數(shù),防止過擬合[12]。
考慮由于個(gè)體差異可能導(dǎo)致評(píng)分過低或過高,使用baseline predictors基準(zhǔn)預(yù)測(cè)。將平均評(píng)分設(shè)為μ,設(shè)用戶做出的評(píng)分相對(duì)于平均評(píng)分的偏差為bui,設(shè)商品cj相對(duì)于平均分的偏差為bcj,得到:
(10)
結(jié)合式(8)和式(10),有:
(11)
于是損失函數(shù)可以重新表述為:
(12)
對(duì)式(13)求導(dǎo)到求解函數(shù):
(14)
其中,γ為學(xué)習(xí)率。
利用評(píng)分矩陣中已知的評(píng)分求解上述函數(shù)(14),訓(xùn)練得到損失函數(shù)值最優(yōu)時(shí)的參數(shù),從而確定損失函數(shù),完成對(duì)模型的訓(xùn)練。通過損失函數(shù)可以預(yù)測(cè)用戶對(duì)商品的評(píng)分,完成推薦任務(wù)。
實(shí)驗(yàn)是在Intel-Core i7雙核處理器,CPU1 2.60 GHz,CPU2 2.0 GHz,內(nèi)存4 G的計(jì)算機(jī)上進(jìn)行,采用Window8.1操作系統(tǒng),編程語(yǔ)言是Python 3.6。
實(shí)驗(yàn)數(shù)據(jù)來自傳統(tǒng)漢服網(wǎng)站“衣緣巷”的用戶統(tǒng)計(jì)數(shù)據(jù)。隨機(jī)選取了158名用戶對(duì)20件服裝進(jìn)行評(píng)分,評(píng)分范圍是1~7。
算法流程如圖1所示。
圖1 算法流程
將獲取到的數(shù)據(jù)進(jìn)行數(shù)據(jù)清理,剔除user_id、item_id數(shù)據(jù)內(nèi)容缺失的數(shù)據(jù)項(xiàng)。再將數(shù)據(jù)集重新整合成(user_id,item_id,rating)三元組結(jié)構(gòu)。使用交叉驗(yàn)證[14]來驗(yàn)證數(shù)據(jù),將數(shù)據(jù)隨機(jī)分成三份進(jìn)行三組測(cè)試,第一組實(shí)驗(yàn)選定其中兩份數(shù)據(jù)作為訓(xùn)練數(shù)據(jù),剩下的一份作為測(cè)試數(shù)據(jù);其他兩組數(shù)據(jù)也是執(zhí)行同樣的操作。
初始化式(13)的學(xué)習(xí)率γ為0.002,因子factors的維數(shù)初始化為100,表示將要分解的評(píng)分矩陣的因子最多有100個(gè)。模型測(cè)試指標(biāo)見表5。
表5 模型測(cè)試指標(biāo)
圖2反映了實(shí)際評(píng)分和預(yù)測(cè)評(píng)分之間的絕對(duì)誤差主要集中在“1”分左右,意味著該模型預(yù)測(cè)用戶的評(píng)分出現(xiàn)的誤差大部分不超過“1”。
通過計(jì)算客戶對(duì)商品的實(shí)際評(píng)分和模型的預(yù)測(cè)評(píng)分之間的絕對(duì)誤差占總分“7”的百分比,觀察模型的總體預(yù)測(cè)性能,如圖3所示??梢园l(fā)現(xiàn)誤差百分比超過50%的誤差基本沒有,誤差百分比大部分集中在30%,其中誤差百分比為10%的誤差的樣本數(shù)量居多。
圖2 絕對(duì)評(píng)分誤差散點(diǎn)分布
圖3 模型預(yù)測(cè)誤差分布
總體來說,該模型相對(duì)于現(xiàn)行的其他推薦算法是可靠的。SVD算法的優(yōu)勢(shì)在于可以較為準(zhǔn)確地預(yù)測(cè)用戶評(píng)分,實(shí)現(xiàn)精準(zhǔn)推薦。但在用戶和商品基數(shù)特別
大的情況下,SVD算法會(huì)因矩陣分解的時(shí)間效率低而優(yōu)勢(shì)不在,表明該算法非常適合用戶數(shù)量不夠巨大,商品種類不太繁多的小型在線商城。